【发布时间】:2019-01-24 07:22:35
【问题描述】:
假设我们有一个具有以下架构的表:
CREATE TABLE Persons (
sid int NOT NULL AUTO_INCREMENT,
groupName varchar(255) NOT NULL,
userIdInGroup int,
PRIMARY KEY (sid));
我们希望根据该组的最后一个 userId 为同一组中的每个新用户分配一个自动递增的 userId,即我们希望在每个组中模拟一个自动递增的 userId。
由于考虑到 MAX(userIdInGroup) 我们要插入新的 userId,我们需要将 select 和 insert 包装到事务中。像这样的:
START TRANSACTION
SET @a = (SELECT MAX(userIdInGroup) FROM Persons WHERE groupName= 'Foo') +1;
INSERT THE NEW ROW USING userIdInGroup = @a
COMMIT
- 只是在事务中选择 MAX 是安全的,还是我们需要通过 SELECT FOR UPDATE 锁定某些内容?
- 有没有办法绕过事务仍然保持一致?
【问题讨论】:
-
我只是觉得这是个坏主意。只需存储一个自动递增的 id,并在需要时计算组中的位置..
标签: mysql sql transactions