我正在尝试实施最终用户锁定系统,例如,
"CREATE TABLE foo (
resource_id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (resource_id)
) ENGINE = InnoDB $collate;" );
当用户签出资源时,我想尝试为资源和用户插入一行。可能已经有给定资源的另一个用户条目,在这种情况下,我想从现有行中选择该用户ID,而我仍然持有锁。如果没有现有的行,我希望插入成功,然后在释放锁之前选择我刚插入的相同用户ID。
这样的事情会做我希望的还是有更好的方式?
START TRANSACTION;
INSERT IGNORE INTO foo (resource_id, user_id) VALUES (4, 2)
SELECT user_id FROM foo WHERE resource_id = 4
COMMIT;
答案 0 :(得分:0)
根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html:
如果发生重复键错误,则设置重复索引记录上的共享锁。
鉴于此,我认为INSERT IGNORE然后在同一事务中的SELECT应该可以工作。