加锁失败且出现环时触发死锁
事务1 | 事务2 |
---|---|
begin; | |
select *from testlock where id=1 for update; | begin; |
select *from testlock where id=2 for update; | |
select *from testlock where id=2 for update; 加锁失败 | |
select *from testlock where id=1 for update; 加锁失败且出现环 | |
commit; | |
commit; |
解决:
可以利用分布式锁保证数据库的多表操作按顺序执行
可以将事务拆分为多个小事务,分别提交,再做状态重放的补偿机制
MySql检查是死锁的条件: 只要事务维持锁和等待锁形成环路即出现死锁
回滚~
当事务持有锁数相同时,随机一个事务进行回滚
当事务持有锁数不同时,按持久锁少的进行回滚,如下图,回滚事务2
查询是否锁表
SHOW OPEN TABLES where in_use > 0;
查看最近死锁的日志(找DEADLOCK字样)
show engine innodb status