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















![[BLIP]-多模态Language-Image预训练模型](https://img-blog.csdnimg.cn/b8fc872f58da460dac8ec9aa5d8c45b9.png)



