MySQL online DDL分为INPLACE和COPY两种方式,通过在ALTER语句的ALGORITHM参数指定,两种方式除了实现方式不同外,整个过程中MDL上锁也是不一样的。
对于alter table test.t1 add column name varchar(10), algorithm=copy;,alter用copy到临时的方式来做。整个过程中MDL顺序是这样的:
prepare阶段:先申请MDL_SHARED_UPGRADABLE锁,然后升级到MDL_SHARED_NO_WRITE锁
alter阶段:MDL_SHARED_NO_WRITE锁
commit阶段:升级到MDL_EXCLUSIVE锁
对于alter table test.t1 add column name varchar(10), algorithm=inplace;,如果alter使用inplace算法的话,整个过程中MDL加锁顺序是这样的:
prepare阶段:先申请MDL_SHARED_UPGRADABLE锁,然后升级到MDL_EXCLUSIVE锁,再降级到MDL_SHARED_UPGRADABLE锁
alter阶段:MDL_SHARED_UPGRADABLE
commit阶段:升级到MDL_EXCLUSIVE锁
MDL_SHARED_UPGRADABLE跟select获取的SR锁和dml获取的SW锁都兼容
MDL_SHARED_NO_WRITE跟select获取的SR锁兼容,跟dml获取的SW锁冲突
MDL_EXCLUSIVE跟select获取的SR锁和dml获取的SW锁都冲突
对于alter table test.t1 add column name varchar(10), algorithm=copy;,alter用copy到临时的方式来做。整个过程中MDL顺序是这样的:
prepare阶段:先申请MDL_SHARED_UPGRADABLE锁,然后升级到MDL_SHARED_NO_WRITE锁
alter阶段:MDL_SHARED_NO_WRITE锁
commit阶段:升级到MDL_EXCLUSIVE锁
对于alter table test.t1 add column name varchar(10), algorithm=inplace;,如果alter使用inplace算法的话,整个过程中MDL加锁顺序是这样的:
prepare阶段:先申请MDL_SHARED_UPGRADABLE锁,然后升级到MDL_EXCLUSIVE锁,再降级到MDL_SHARED_UPGRADABLE锁
alter阶段:MDL_SHARED_UPGRADABLE
commit阶段:升级到MDL_EXCLUSIVE锁
MDL_SHARED_UPGRADABLE跟select获取的SR锁和dml获取的SW锁都兼容
MDL_SHARED_NO_WRITE跟select获取的SR锁兼容,跟dml获取的SW锁冲突
MDL_EXCLUSIVE跟select获取的SR锁和dml获取的SW锁都冲突
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21167890/viewspace-2152276/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21167890/viewspace-2152276/
本文详细介绍了MySQL在线DDL的两种方式:INPLACE和COPY,并对比了它们在MDL加锁顺序上的区别。对于INPLACE方式,准备阶段会从MDL_SHARED_UPGRADABLE锁升级到MDL_EXCLUSIVE锁再降级到MDL_SHARED_UPGRADABLE锁;对于COPY方式,则是从MDL_SHARED_UPGRADABLE锁升级到MDL_SHARED_NO_WRITE锁。
1046

被折叠的 条评论
为什么被折叠?



