请问这两个sql事务是否会死锁? (/解决1回滚)

时间:2016-08-22 12:48:17

标签: sql database transactions innodb deadlock

假设我有一个购买交易做这样的事情:

START TRANSACTION;
UPDATE `USER` SET `Money` = `Money - '100';
UPDATE `ITEMS` SET `Item` = `Item` + '1';
COMMIT;

不幸的是,同时一个cron跑了,对每个人现有的平衡感兴趣:

UPDATE `USER` SET `Money` = `Money` + '50';

(包含在事务中或只包含一个自动提交)

这会导致任何情况下的僵局吗? (这可以通过dbms回滚一个来解决)

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

死锁需要:

  • 两个不同的交易
  • 这两个人中的每一个都已经持有一些锁
  • 并且这两者中的每一个都需要另一个
  • (需要另一个已经由另一个交易持有)。

理论上可能发生在您的场景中,如果您的锁不在整个表上(但更精细)并且更新USERS表的访问策略不同(以不同的顺序处理表的物理页面) )。在这种情况下,这将是非常奇怪的,但是,以任何方式依赖于假设的查询处理内部行为绝不是一个好主意。