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

时间: 2024-10-10 18:07:48

mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析。的相关文章

Innodb 锁系列2 事务锁

上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来介绍,先来介绍下事务锁相关的数据结构 事务锁数据结构 1. 锁模式 /* Basic lock modes */ enum lock_mode { LOCK_IS = 0, /* intention shared */ LOCK_IX, /* intention exclusive */ LOCK_

MySQL中的latch(闩锁)详解——易产生的问题以及原因分析

Latch 什么是latch: 锁是数据库系统区别与文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb存储引擎在行级别上对表数据上锁,这固然不错.但是Innodb也会在多个地方使用锁,从而允许多种不同资源提供并发访问.例如,操作缓冲池汇总的LRU列表,删除.添加.移动LRU列表中的元素,为了保证一致性,必须有锁的介入,这就是latch锁. latch与lock的区别 latch一般称为闩锁(轻量级别的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差

MySQL中kill所有慢查询进程和锁表进程

1.kill所有慢查询进程: #!/bin/bash mysql -uroot -pMy_Password -e "show processlist" | grep -i "Query" > slow_query.log for query in `cat slow_query.log | awk '{print $1}'` do echo "kill $query;" > kill_slow_query.sql done 登录mys

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

MySQL 中事务详解

1.事务的概念 2.在MySQL中哪些存储引擎(表类型)支持事务哪些不支持 3.事务的四个属性 4.mysql事务的创建与存在周期 5.mysql行为 6.事务的孤立性和性能 7.mysql的伪事务 一.事务的概念 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的.而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚.所有受到影响的数据将返回到事物开始以前的状态:如果单元中的所有SQL语句均执行成功,则事物被

MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于

【转】MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲

转:MYSQL中的乐观锁实现(MVCC)简析

from: https://segmentfault.com/a/1190000009374567 什么是MVCC MVCC即Multi-Version Concurrency Control,中文翻译过来叫多版本并发控制. MVCC是解决了什么问题 众所周知,在MYSQL中,MyISAM使用的是表锁,InnoDB使用的是行锁.而InnoDB的事务分为四个隔离级别,其中默认的隔离级别REPEATABLE READ需要两个不同的事务相互之间不能影响,而且还能支持并发,这点悲观锁是达不到的,所以RE

mysql中的锁机制之概念篇

锁的概念 ①.锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具. ②.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制. ③.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源. ④.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题. ⑤.锁的冲突也是影响数据库并发访问性能的一个重要因素. MySQL锁的概述 相对于其它数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的