数据库死锁及解决方法

来源:互联网 发布:程序员要懂软件架构吗 编辑:程序博客网 时间:2024/05/22 15:59

死锁的概念:

  死锁是指两个或者两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

死锁的处理机制:

 解决死锁最有用最简单的方法是不要有等待,将任何等待都转化为回滚,并且事务重新开始。但是有可能影响并发性能。

  • 1:超时回滚,即当两个事务互相等待时,当一个等待时间超过设置的某一阀值的时候,其中一个事务进行回滚,另一个事务就能继续进行。在InnoDB引擎中,参数innodb_lock_wait_time用来设置超时的时间。
  • 2:wait-for-graph方法:跟超时回滚比起来,这是一种更加主动的死锁检测方式。InnoDB引擎也采用这种方式。

wait-for graph图:

这种方式一般要求数据库保存一下两种信息:锁的信息链表和事务等待链表。通过这两条链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间互相发生等待。在wait-for graph中,事务为图中的节点。而在图中,事务T1指向T2边的定义为:
  1. 事务T1等待事务T2所占用的资源
  2. 事务T1最终等待T2所占用的资源,也就是事务之间在等待相同的资源,而事务T1发送在事务T2的后面。
示例:


从wait-for graph图中我们可以发现存在回路(t1,t2),因此存在死锁。
0 0