文章插图
事务A在T5执行时,事务B会收到一条错误信息
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
此处发生死锁,因为事务A需要X锁才能删除该行 。但是,不能授予该锁定请求,因为事务B已经具有X锁定请求,并且正在等待事务A释放其S锁定 。由于B事先要求X锁,因此A持有的S锁也不能升级为X锁 。结果,InnoDB为其中一个客户端生成一个错误并释放其锁 。此时时,可以授予对另一个客户端的锁定请求,并从表中删除该行 。
也就是说MySQL可以自动检测死锁,并且放弃一个事务来成全另一个事务,这点与Java程序中的死锁不一样 。
查询事务、锁相关的参考命令如下:
## 查看当前事务状态select trx_id, trx_state, trx_started, trx_requested_lock_id, trx_wait_started, trx_query, trx_isolation_level from information_schema.innodb_trx;## 查看当前锁定的事务select * from information_schema.innodb_locks;## 查看当前正在等待锁的事务select * from information_schema.innodb_lock_waits;
总结锁是MySQL非常重要的一个部分,虽然一般情况下锁的锁定和释放都由MySQL自动完成 。但是了解MySQL中的锁还是很有必要,它让我们进一步的了解了MySQL是如何处理并发的 。
作者:Sicimike
原文链接:https://blog.csdn.net/Baisitao_/article/details/104829887
【强人“锁”难,MySQL到底有多少锁?】
推荐阅读
- Linux驱动-互斥锁用法,建议先保存
- 教育部|教育部传出好消息,对“学历歧视”的第一学历,将不再限制专科生
- 褚时健|人到中年,需要一次“重启”!
- 华为|宝马牵手华为 华为应用商店登陆全新7系:可安装“宝宝巴士”
- 电动车|收割国外“韭菜” 小鹏P5欧洲四国开售:起售价最低27.93万元
- 韩信之死萧何后悔吗 萧何杀韩信的原因
- 岚湖山茶叶加盟信息,茶叶连锁经营之经营出发点
- 论文|中科院内部邮件揭开知网“黑幕”:近千万续订费苦不堪言
- 百塔之城布拉格在哪?
- 这两种“中药零食” 要悠着点吃