我在中等到高負載情況下遇到死鎖。這裏是細節。Mysql在插入和更新時出現死鎖
的MySQL-5.5.21-55
引擎:InnoDB的
表:訂單
# Field, Type, Null, Key, Default, Extra
id, bigint(20) unsigned, NO, PRI, , auto_increment
sno, varchar(32), NO, MUL, ,
misc1, int, NO, , 0,
表:OrderItem的
# Field, Type, Null, Key, Default, Extra
id, bigint(20) unsigned, NO, PRI, , auto_increment
order_id, bigint(20), YES, MUL, ,
f1, varchar(50), YES, , ,
f2, varchar(100), YES, , ,
misc2, int, NO, , 0,
- 訂購 .sno是唯一
- OrderItem的 .order_id沒有被定義爲外鍵,但用作應用外鍵
- 訂購具有一個一對多關係與OrderItem的
- OrderItem的 .order_id + OrderItem的 .f1 + OrderItem的 .f2是唯一
USECASE:
- 每當訂單或OrderItem的需要更新任何記錄,我要廢止舊記錄(或刪除),並插入新的。
- 可能因此發生較早,在訂購一個記錄(例如order1)有3條記錄OrderItem的(例如orderItem1,orderItem2,orderItem3)。但現在我想把它作爲order1-> orderItem1,orderItem4,orderItem5或全新的集合。這就是爲什麼我想要將舊記錄全部無效並插入新記錄以查明訂單項變得複雜的原因。
多線程會做這個操作;但他們會在不同的記錄集上工作。我在一個時間
我試了一下在25 訂單經營:
- 插入訂單;重複密鑰更新訂購並從訂單項刪除所有子項並插入訂單項 s。
- 呼籲IS_ACTIVE在訂單並標記爲同一SNO的所有記錄爲0,並在秩序插入新記錄的另一列;將新的子女插入訂單項。
- 從刪除訂單給定的sno;從刪除OrderItem爲同一個sno.Insert插入兩個表中新鮮。
以上所有方法都會導致無法鎖定,有些時候或其他時間。 沒有其他線程或進程正在處理這些表。
觀察:
通過以下鏈接
去了,發現更新/刪除多個記錄導致MySQL獲得下一個關鍵鎖定一個t REPEATABLE_READ隔離級別(這是默認級別)。在我看來這導致了這個問題。
感謝您能否提供解決方案。
鎖只鎖定其他連接,不能在同一數據庫連接上的操作之間發生死鎖。 – Barmar
「新訂單」動作如何觸發...?一個簡單的http請求? –
@Barmar連接不被線程共享。 –