强人“锁”难,MySQL到底有多少锁?( 三 )


文章插图
 
事务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到底有多少锁?】


推荐阅读