MySQL UPDATEデッドロック分析

740 ワード

Table
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_user_item_id` (`user_id`,`item_id`,`status`)
) ENGINE=INNODB DEFAULT 

Update
update user_item set status=1 where user_id=xxx and item_id=xxx

Analyse
innodb update文では、次の手順に従います.
1、     idx_user_item_id   (   )
2、PK   (   ); 
             ,             ;
3、     ,  ,      。

1,2ステップの間に類似文update user_がある場合item set status=1 where id=xxx and user_id=xxxはデッドロックをもたらします.PKをロックしてからidxをロックします.user_item_id.
Conclusion
updateは、プライマリ・キーPKをロックしてから操作します.