mysql alter table的过程

来源:互联网 发布:2016年网络最火的情歌 编辑:程序博客网 时间:2024/06/05 23:01

今天遇到一个有趣的问题,即多个update操作与alter操作如何来竞争锁的问题,猜想mysql内部可能会使用一个队列来控制,但具体是什么样的队列,还不清楚。

简单的跟踪了下,一个alter操作其实可以切分成多个过程:


1. 创建一个临时表,例如(table_name=0x48fa7720 "#sql-2f8e_3")

2.为临时表创建索引

3.index_read

4.index_write  将原表的索引数据写入新索引

5.将原表数据写入临时表

6.将原表进行rename,例如:

ha_innobase::rename_table (this=<value optimized out>, from=0x48fa5d10 "./zhaiwx/test", to=0x48fa5b00 "./zhaiwx/#sql2-2f8e-3")

7.将临时表rename为原表,例如:

ha_innobase::rename_table (this=<value optimized out>, from=0x48fa5d10 "./zhaiwx/#sql-2f8e_3", to=0x48fa5b00 "./zhaiwx/test")

8.删除原表:

ha_innobase::delete_table (this=<value optimized out>, name=0x48fa5de0 "./zhaiwx/#sql2-2f8e-3") at handler/ha_innodb.cc:6622

--------------------------------------------

以上是跟踪gdb的副产物,真实性有待证实,跟踪的方法是在lock_table函数设断点,每次bt,可以很清晰明了的看到alter的过程。。。

在一次alter table操作过程中,多次调用了lock_table函数。那么进入该函数,我们可以发现,其做了以下工作:

1. 

/* Look for stronger locks the same trx already has on the table */if (lock_table_has(trx, table, mode)) {lock_mutex_exit_kernel();return(DB_SUCCESS);}


2.

/* We have to check if the new lock is compatible with any locksother transactions have in the table lock queue. */if (lock_table_other_has_incompatible(trx, LOCK_WAIT, table, mode)) {/* Another trx has a request on the table in an incompatiblemode: this trx may have to wait */err = lock_table_enqueue_waiting(mode | flags, table, thr);lock_mutex_exit_kernel();return(err);}lock_table_create(table, mode | flags, trx);


-----------------

跟进到lock_table_other_has_incomatible函数,可以发现,会对一个锁队列进行遍历,判断其中是否有和当前要求的锁相冲突的,如果有,那么就需要

调用lock_table_enqueue_waiting函数将当前请求加入到锁队列中,并等待(除此外,还会检查是否可能产生死锁,具体尚未分析)。


可见,mysql是用锁队列(lock queue)来控制可能产生冲突的请求,锁的类型包括:

/* Basic lock modes */enum lock_mode {LOCK_IS = 0,/* intention shared */LOCK_IX,/* intention exclusive */LOCK_S,/* shared */LOCK_X,/* exclusive */LOCK_AUTO_INC,/* locks the auto-inc counter of a tablein an exclusive mode */LOCK_NONE,/* this is used elsewhere to note consistent read */LOCK_NUM = LOCK_NONE/* number of lock modes */};

---------------------------------

mysql锁的管理还是相当复杂的,本文只是找到了一个研究锁管理的入口,至于其内部具体如何管理的,还需要更加深入的研究


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肇事逃逸没钱赔怎么办 撞死人无力赔偿怎么办 宝贝咳嗽很厉害怎么办 开车有人别车怎么办 判刑罚金交不起怎么办 罚金太多交不起怎么办 判决书上的罚金怎么办 刑事罚款不交怎么办 缎面的鞋脏了怎么办 夏天脸上长粉刺怎么办 鬃狮不吃东西怎么办 买二手车的车牌怎么办 榴莲打开了肉没熟怎么办 gmat的prep做完怎么办 电脑没ip地址怎么办 电脑ip地址缺失怎么办 cos还原不了人物怎么办 执行局抓人十五天不放人怎么办 笔记本电脑键盘按键错乱怎么办 靠墙倒立上不去怎么办 医院多收钱了怎么办 学生总是转笔怎么办 吃错东西呕吐怎么办 手腕筋扭伤了怎么办 右膝盖内侧疼痛怎么办 膝盖关节腔积液怎么办 小孩玩游戏花钱怎么办 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办 小孩子特别能吃怎么办 小孩吃不下去药怎么办