设为首页 收藏本站
查看: 352|回复: 0

[经验分享] mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-10 17:42:09 | 显示全部楼层 |阅读模式
mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析。

一.Latch和Tlock的关系

Latch:为保护临界资源的正确性而设计,例如保护正在使用的内存页面不被破坏等。
没有死锁检测机制,轻量锁,并且作用对象时内存页面或是内存共享变量.

Tlock:事务锁,作用对象是事务,有死锁检测机制.
在innodb内部,为了减少死锁的发生概率,Latch不会等待Tlock.

线程获取行锁的流程:
在对行加锁的时候会先对行所在的页面添加lath,然后再对行添加Tlock,待对行添加完Tlock后再释放页面的Lath。
这种机制主要是为了保证线程获取的行数据的一致性和完整性.
如果行被其他的线程占有,线程先释放页面latch,等待行锁,待获取行锁后会再次对页面添加latch,查看页面数据是否有改动,再次获取改动后的行。


二.DML加锁规则
DML加锁的语句有,insert/update ... where ..../ delete from  .. where .. /  select * from  

insert不添加锁,但是在有唯一所以的时候,会对唯一索引做唯一性检查(加s锁,在将s锁转化为x锁),都是行锁。

update ... where.. / delete ... where ../select ... where lock in share mode / select .. where .. for update

(1).数据查找走了索引,但是表达式为不等号,则会添加区间锁(gap).
例如. > 10  ,则锁定区间为(10,+~)
<10 ,则锁定区间为(-~,10) .

(2).数据查找走的唯一索引,并且表达式为等号(=),则添加行锁(record lock but not gap) 。

(3).数据查找为非唯一索引,并且表达式为等号,会添加区间锁(record lock gap),会锁定的区间为( ] ,允许更新,不允许插入.

重点:区间锁是为了防止出现幻觉读的,所以只阻塞插入操作.对更新不影响


三.死锁案例分析.

(1).insert,并发插入相同的数据,并且插入字段中有唯一键存在,
在正常的插入过程中是不会添加任何锁的,但是在有唯一键的时候会对唯一键的字段做唯一性检查,在检查的过程中会对记录共享锁(S),
当多个线程对同一行添加共享锁(S)之后,会将共享锁(s)转化为排他锁(X),此时就会相互等待,产生死锁.

(2).update并发更新,更新的字段有索引
线程一根据索引字段更新一个行,线程二根据主键更新索引字段.
此时线程一获得了索引等待行 ,线程二获得了行等待索引。

(3)delete,根据某一个唯一索引字段并发删除记录。
过程非常复杂,详情见一下链接:
http://www.cnblogs.com/sunss/p/3166550.html


(4).insert和delete并发,有非聚集索引
线程1根据某个非聚集索引字段删除数据,线程2插入相同的记录。
线程1获得了索引,等待行,线程2获得了行,等待索引。

(5).insert 和update并发,有非聚集索引。
死锁原理同4.

(6)delete 和update 并发.
原理同2.


死锁案例连接:
innodb next-key lock引发的死锁:
http://www.cnblogs.com/xhan/p/3701459.html
唯一键造成的死锁:
http://www.cnblogs.com/sunss/p/3166550.html
mysql中的delete死锁
http://hedengcheng.com/?p=844


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-189141-1-1.html 上篇帖子: 关于mysql主从的数据同步不一致的解决方法 下篇帖子: mysql 之my.cnf配置调优
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表