2016-08-22 80 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表的訪問策略不同(處理表中的物理頁面一個不同的順序)。在這種情況下,這會非常奇怪,但是,以任何方式依賴於假定的查詢處理內部行爲都不是一個好主意。