前面我们了解了MySQL的锁类型,那么在使用锁之后,大概率会出现死锁的情况。
什么是死锁
死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死锁”。
常见的报错信息为 ” Deadlock found when trying to get lock... ”。
举例来说 A 事务持有 X1 锁 ,申请 X2 锁,B事务持有 X2 锁,申请 X1 锁。A 和 B 事务持有锁并且申请对方持有的锁进入循环等待,就造成了死锁。这个跟多线程加锁发生死锁的情况是一样的。
死锁日志
执行show engine innodb status;可以查看到最近一次死锁的日志。
死锁案例
案例其实不需要多讲了,因为如果都是行锁,就尽量避免业务1去先更新A再更新B的时候,另一个业务2去更新B之后再更新A。
还有一种情况就是间隙锁的各种情况,举例业务1去删除了一个不存在的id,申请到了间隙锁,而业务2去插入这个间隙之内的值,导致死锁。
Refer:搜狐三面:说说你是怎么解决MySQL死锁问题的!