介绍
这篇文章将为大家详细讲解有关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如何产生死锁的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。