データベースupdateデッドロック

1070 ワード

一般的なデッドロックシーン、一括updateを同時に実行するシーン:
update cross_marketing
set gmtModified = NOW(),
pageview = pageview+ #extpageview#
WHERE marketingId=#marketingId#

 
最初の呼び出し時にmarketingIdが値の順序を入力:1,
3,5,12
2回目の呼び出し時にmarketingIdから値が入力される順序:1,2,5,3
 
updateのたびにローがロックされます.
では、1回目の呼び出しでは、順番に行をロックし、3を更新して新しい5と準備すると、5が2回目の呼び出しで行をロックされていることに気づき、待機します.このときの2回目の呼び出しはちょうど新完5と3のロックを取りに行く準備をしていたが、1回目の呼び出しで占有されていることに気づき、デッドロックが現れた.
 
したがって,一括更新,削除操作の際には,一定の順序で並べ替え,操作を行う.
前の例では、marketingIdに従って小さいものから大きいものに並べ替えると、次のようになります.
最初の呼び出し時、marketingIdは値の順序を入力します:1,3,5,12
2回目の呼び出しの場合、marketingIdは値の順序を入力します:1,2,3,5
これにより、デッドロックの発生が回避されます.