| 事务1 | 事务2 | 现象 |
|---|---|---|
| Begin; | Begin; | |
| update t_user set name="11" where id=1; | update t_user set name="22" where id=2; | |
| update t_user set name="111" where id=2; | 锁等待 | |
| update t_user set name="222" where id=1; | 死锁 |
1. 锁等待
1.1 锁等待定义
当事务1请求事务2所持有记录,而该记录又被事务2上排他锁,这个时候事务1 就需要等待该锁的释放,这种现象就叫锁等待。
1.2 锁等待的解决方法
?待完成... 参考:www.51cto.com/article/615…
1.2.1 解决
2. 死锁
2.1 死锁定义
并发下的线程,互相等待对方所持有的资源,导致无限阻塞的现象称之为死锁。
如上图所示,当事务1和事务2 同时请求对对方所持有资源加排他锁时,就会发生死锁。
【持有资源:表示当前事务已对该资源加了排他锁。】
2.2 死锁的四大原因
2.2.1 互斥
线程所持有的资源具有互斥性,即只能被一个线程持有。
2.2.2 占有且等待
两个线程都占有着资源,且同时等待对方的资源释放。
2.2.3 无法抢占
资源一旦被一个线程持有了,就无法被其他线程抢占,必须等当前线程释放资源。
2.2.4 循环等待
两个线程都在等待对方释放资源,一直不停的阻塞等待。
2.3 死锁的定位方法
2.3.1 可以通过下面的sql语句,查看死锁的详细信息
show engine innodb status;