mysql如何产生死锁的

  介绍

这篇文章将为大家详细讲解有关mysql如何产生死锁的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

mysql中死锁& lt; DeadLock>:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁,所以解决死锁主要还是针对于最常用的InnoDB。

死锁的关键在于:两个(或以上)的会话加锁的顺序不一致。

那么对应的解决死锁问题的关键就是:让不同的会话加锁有次序

<强>案例

需求:将投资的钱拆成几份随机分配给借款人。

起初业务程序思路是这样的:

投资人投资后,将金额随机分为几份,然后随机从借款人表里面选几个,然后通过一条条选择更新去更新借款人表里面的余额等。

例如两个用户同时投资,一个用户金额随机分为2份,分给借款人1、2

B用户金额随机分为2份,分给借款2人,1

由于加锁的顺序不一样,死锁当然很快就出现了。

对于这个问题的改进很简单,直接把所有分配到的借款人直接一次锁住就行了。

select * from xxx在id (xx, xx, xx)更新

在在里面的列表值mysql是会自动从小到大排的序,加锁也是一条条从小到大加的锁

,例如(以下会话id为主键):   ,   Session1:   ,   mysql>, select  *,得到t3  where  id (8、9),拷贝for 更新;   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,id  course  |, name  |, ctime ,,,,,,,,,,,,, |   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,,8,|,WA ,,,, |, f ,,, |, 2016 - 03 - 02, 11:36:30  |   |,,9,|,JX ,,,, |, f ,,, |, 2016 - 03 - 01, 11:36:30  |   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   rows  set 拷贝(0.04,sec)   ,   ,   Session2:   select  *,得到t3  where  id 拷贝(10 8 5),for 更新;   锁等待中……   ,   其实这个时候id=10这条记录没有被锁住的,但id=5的记录已经被锁住了,锁的等待在id=8的这里   不信请看   ,   Session3:   mysql>, select  *,得到t3  where  id=5, for 更新;   锁等待中   ,   ,   Session4:   mysql>, select  *,得到t3  where  id=10, for 更新;   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,id  course  |, name  |, ctime ,,,,,,,,,,,,, |   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,10,|,JB ,,,, |, g ,,, |, 2016 - 03 - 10, 11:45:05  |   + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   row  set 拷贝(0.00,sec)   ,   ,   在其它会话中id=5是加不了锁的,但是id=10是可以加上锁的。

关于mysql如何产生死锁的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

mysql如何产生死锁的