标签:str 资源 死锁 更新 语句 tab src ssi 释放
死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种相互等待的现象。
具体的介绍可以参考我以前写的一篇文章:【并发编程挑战】死锁
以下文字全部摘抄整理自《MySQL技术内幕 InnoDB存储引擎 第二版》,在InnoDB存储引擎中,采用wait-for graph(等待图)的方式来进行死锁检测。
wait-for graph要求数据库保存一下两种信息:
通过上述链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间相互发生等待。在wait-for graph中,事务为图中的节点。在图中,事务T1指向T2定义为:
下面通过一个例子分析,当前事务与锁的状态如下图:
由图可知:
最终的wait-for graph如图:
可以发现上图存在回路(t1,t2),因此存在死锁。通常来说InnoDB存储引擎会回滚undo量最小的事务。
以下死锁例子分析摘抄整理自:MySQL 加锁处理分析
事务隔离级别为默认的RR(Read Repeatable)。
图中,表T1的id列为主键。
按步骤来分析:
图中,表T2的id为主键列,name与pubtime为索引列。
[1,hdc,100]
,后[6,hdc,10]
[6,hdc,10]
,[100,bbb,20],[1,hdc,100]
由上面的两段分析,可以发现t1与t2,对于行[1,hdc,100]
与行[6,hdc,10]
的加锁顺序是反的,如果t1与t2恰好都持有第一把锁,请求第二把锁,那么就会产生回路,发生死锁。
通过上面的学习,可以发现死锁产生的关键是:多个事务的加锁顺序不一致,而且产生资源的相互等待。
标签:str 资源 死锁 更新 语句 tab src ssi 释放
原文地址:https://www.cnblogs.com/clawhub/p/11780208.html