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,然后再操作。