在 PHP 中处理 MySQL 死锁的最佳实践是什么?我是否应该将所有数据库调用包装在 try{}catch{} 块中并从数据库中查找 DeadLock 错误代码?然后我是否再次重新发出整个事务(我假设失败的事务回滚)?
死锁返回错误1213
您应该在客户端处理它
请注意,死锁和锁等待是不同的事情。在僵局中,不存在“失败”的交易:他们都是有罪的。无法保证哪一个会被回滚。
死锁发生在这样的场景中:
UPDATE t_first -- transacion 1 locks t_first
SET id = 1;
UPDATE t_second -- transaction 2 locks t_second
SET id = 2;
UPDATE t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET id = 2;
UPDATE t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET id = 2;
您确定没有将其与锁等待混淆吗?
每当一个事务试图锁定已被另一个事务锁定的资源时,就会发生锁定等待。
在上面的示例中,步骤中发生了锁等待3
.
由于这是正常情况(与死锁不同),可以通过提交或回滚持有锁的事务从外部解决,InnoDB
不会尝试回滚持有锁的事务。
相反,它只会在超时发生后取消尝试获取锁的语句。
默认超时时间是50
秒并设置使用innodb_lock_wait_timeout.
失败的语句(试图acquire锁)将返回错误1205
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)