2026-01-27 04:53:20
锁等待是指在一个事务(session)已经对某行数据获取了独占锁(通常是写锁)后,另一个事务尝试对相同的行获取独占锁时,需要等待前一个事务释放锁的情况。
Session A 执行 BEGIN; update ordersetyear= '2022' where id = '1';,此时 Session A 获取了 id=1 的写锁权限。
Session B 执行相同的更新语句,由于 id=1 的写锁已被 Session A 获取,Session B 会进入锁等待状态。
死锁是指两个或更多的事务在相互等待对方释放资源,从而导致所有事务都无法继续执行的情况。
两个事务分别持有不同的锁,并尝试获取对方持有的锁。
例如,Session A 获取了 id=1 的写锁,Session B 获取了 id=2 的写锁。然后 Session A 尝试获取 id=2 的写锁,而 Session B 尝试获取 id=1 的写锁,此时两者都进入锁等待状态,形成死锁。
Session A 执行 BEGIN; update ordersetyear= '2022' where id = '1';,获取 id=1 的写锁。
Session B 执行 BEGIN; update ordersetyear= '2022' where id = '2';,获取 id=2 的写锁。
Session A 尝试执行 update ordersetyear= '2022' where id = '2';,进入锁等待状态。
Session B 尝试执行 update ordersetyear= '2022' where id = '1';,也进入锁等待状态。
此时,Session A 和 Session B 都在等待对方释放锁,形成死锁。
综上所述,锁等待和死锁是 MySQL 中常见的并发控制问题。通过合理的事务设计、锁的使用和监控,可以有效地减少和避免这些问题的发生。