交易A开始...
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 1 LIMIT 1;
与此同时,交易B开始...
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 2 LIMIT 1;
UPDATE table_name SET column_name=column_name-1 WHERE id = 1 LIMIT 1;
COMMIT;
现在权,事务B正在等待第1行,该行在交易A中被锁定。
和事务A继续...
UPDATE table_name SET column_name=column_name-1 WHERE id = 2 LIMIT 1;
COMMIT;
现在,我们有一个死锁,所以交易双方都在等待对方要解锁的行,他们要更新:“(
正如我在标题中提到的那样,我们如何防止RDBMS事务中的死锁?
我认为解决这种情况的唯一方法是我们回滚事务B并重新执行它。但是,我们如何才能发现我们处于僵局,立即摆脱困境,我们如何保证我们不会陷入无限循环(例如,在非常沉重的Web应用程序中)。
如果有必要,我使用MySQL。但是对于其他RDBMS的任何解决方案都是值得欢迎的 - 帮助其他人从谷歌来到这里:)
您无法防止死锁,但是,您可以编写最小化其发生的代码。 – Shadow
@trincot我认为,事务A锁定行#1,事务B锁定行#2并等待事务A解锁行#1,并且事务A等待事务B解锁行#2,因此两个事务都在等待对于彼此。如果我错了,你能纠正我吗?谢谢。 – user5483434
@Shadow你能告诉我怎样才能尽量减少他们的发生? – user5483434