2016-08-22 64 views
0

说我有一个购买交易做这样的事情:这两个sql事务会死锁吗? (1个回滚/解决)

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

不幸的是在同一时间一个cron跑,给于大家的兴趣现有的平衡:

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

(无论是交易还是单个自动提交)

在任何情况下会造成死锁吗? (这可以通过dbms回滚来解决)

任何帮助将不胜感激,谢谢。

+0

取决于您正在使用的dbms。 – jarlh

+0

InnoDB/MySQL,但是会导致一个dbms死锁而另一个不是? –

+0

一些dbms从不会死锁。 (例如https://en.wikipedia.org/wiki/Optimistic_concurrency_control) – jarlh

回答

1

死锁要求:

  • 两个不同的交易
  • 每个这两个是已经持有的一些锁
  • 和每个这两个都需要另一个一个
  • (和那另一个交易已经持有另一个交易)。

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