MySQL InnoDB引擎的死锁问题
死锁是什么?
捎带复习一下OS基础
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁产生的四个条件:
- 互斥使用:共享资源被占有时,别的线程不能使用
- 不可抢占:资源请求是非抢占式的
- 请求和保持:资源请求者在请求其他资源的同时保持对原有资源的占有
- 循环等待:存在一个等待队列
当四个条件都成立时才会发生死锁,只要打破一个条件,死锁就会消失
MySQL出现死锁的情况
多线程同时访问共享资源时就可能出现死锁,在InnoDB中,事务中对一行数据进行修改时,就会上行锁,阻止其他事务修改该条记录,只有行级锁会出现死锁现象
事务1开启事务,修改id=1的数据,这时会锁住这行数据,这时事务2开启事务,进行修改id=2的数据,也会锁住这行,这时事务1修改id=2数据时,会进入阻塞,等待事务2的提交,这时事务2又想修改id=1,这时也会进入阻塞,这时就产生了死锁
总结
额 有点简单了
事务可以看作是一个线程,事务并发也回引发一系列多线程的问题,例如死锁,还有原子操作,例如超卖问题