MySQL如何批量更新死鎖

mysql如何批量更新死鎖

本文講解"mysql怎么批量更新死鎖",希望能夠解決相關(guān)問題。

表結(jié)構(gòu)如下:

create?table?`user_item`?(
??`id`?bigint(20)?not?null,
??`user_id`?bigint(20)?not?null,
??`item_id`?bigint(20)?not?null,
??`status`?tinyint(4)?not?null,
??primary?key?(`id`),
??key?`idx_1`?(`user_id`,`item_id`,`status`))?engine=innodb?default?charset=utf-8

sql語句如下:

update?user_item?set?status=1?where?user_id=??and?item_id=?

原因分析:

?mysql的事務(wù)支持與存儲引擎有關(guān),myisam不支持事務(wù),innodb支持事務(wù),更新時采用的是行級鎖。這里采用的是innodb做存儲引擎,意味著會將update語句做為一個事務(wù)來處理。前面提到行級鎖必須建立在索引的基礎(chǔ),這條更新語句用到了索引idx_1,所以這里肯定會加上行級鎖。

?行級鎖并不是直接鎖記錄,而是鎖索引,如果一條sql語句用到了主鍵索引,mysql會鎖住主鍵索引;如果一條語句操作了非主鍵索引,mysql會先鎖住非主鍵索引,再鎖定主鍵索引。

這個update語句會執(zhí)行以下步驟:

  • 由于用到了非主鍵索引,首先需要獲取idx_1上的行級鎖

  • 緊接著根據(jù)主鍵進(jìn)行更新,所以需要獲取主鍵上的行級鎖;

  • 更新完畢后,提交,并釋放所有鎖。

  • 如果在步驟1和2之間突然插入一條語句:update user_item …..where id=? and user_id=?,這條語句會先鎖住主鍵索引,然后鎖住idx_1。

    蛋疼的情況出現(xiàn)了,一條語句獲取了idx_1上的鎖,等待主鍵索引上的鎖;另一條語句獲取了主鍵上的鎖,等待idx_1上的鎖,這樣就出現(xiàn)了死鎖。

    解決方案:

  • 先獲取需要更新的記錄的主鍵

    select?id?from?user_item?where?user_id=??and?item_id=?
  • 逐條更新

    ?update?user_item?set?status=??where?id=??and?user_id=?
  • 批量循環(huán)重復(fù)第一步和第二步即可

  • 關(guān)于 "mysql怎么批量更新死鎖" 就介紹到此。希望多多支持碩編程。

    下一節(jié):mysql中如何創(chuàng)建和查詢外鍵

    mysql教程

    相關(guān)文章
    亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频