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語(yǔ)句如下:
update?user_item?set?status=1?where?user_id=??and?item_id=?
原因分析:
?mysql的事務(wù)支持與存儲(chǔ)引擎有關(guān),myisam不支持事務(wù),innodb支持事務(wù),更新時(shí)采用的是行級(jí)鎖。這里采用的是innodb做存儲(chǔ)引擎,意味著會(huì)將update語(yǔ)句做為一個(gè)事務(wù)來(lái)處理。前面提到行級(jí)鎖必須建立在索引的基礎(chǔ),這條更新語(yǔ)句用到了索引idx_1,所以這里肯定會(huì)加上行級(jí)鎖。 ?行級(jí)鎖并不是直接鎖記錄,而是鎖索引,如果一條sql語(yǔ)句用到了主鍵索引,mysql會(huì)鎖住主鍵索引;如果一條語(yǔ)句操作了非主鍵索引,mysql會(huì)先鎖住非主鍵索引,再鎖定主鍵索引。
這個(gè)update語(yǔ)句會(huì)執(zhí)行以下步驟:
如果在步驟1和2之間突然插入一條語(yǔ)句:update user_item …..where id=? and user_id=?,這條語(yǔ)句會(huì)先鎖住主鍵索引,然后鎖住idx_1。
蛋疼的情況出現(xiàn)了,一條語(yǔ)句獲取了idx_1上的鎖,等待主鍵索引上的鎖;另一條語(yǔ)句獲取了主鍵上的鎖,等待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=?
關(guān)于 "mysql怎么批量更新死鎖" 就介紹到此。希望多多支持碩編程。