MySql死锁产生的原因?[面试7.0]
高并发情况下,事务之间对资源的访问顺序交替会导致死锁
加锁失败且出现环时触发死锁
事务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检查是死锁的条件: 只要事务维持锁和等待锁形成环路即出现死锁
MySql怎么处理死锁的呢?[面试7.0]
回滚~
当事务持有锁数相同时,随机一个事务进行回滚
当事务持有锁数不同时,按持久锁少的进行回滚,如下图,回滚事务2
MySql查看死锁有哪些方法?[面试7.0]
查询是否锁表
SHOW OPEN TABLES where in_use > 0;
查看最近死锁的日志(找DEADLOCK字样)
show engine innodb status