我在一个 sameTable
,
BEGIN
set new.seq = (select (max(seq) + 1) from sameTable);
END;
问题:
它对并发免疫吗?
比方说,为了简化,我需要 seq
在不强制唯一索引的情况下是唯一的。
使用:mariadb,innodb引擎。
编辑
很清楚我不能利用 auto_increment
,触发器如下所示:
BEGIN
case
when new.seq is null then
set new.seq = (
select
(ifnull(max(seq),0) + 1)
from sameTable
where
aField = new.aField
);
else
set new.seq = new.seq;
end case;
END;
现在很清楚 seq
表现得不像 auto_increment
既然有 aField
. 当然 aField-seq
复合是唯一的,但是,再说一次,为了简化,我需要 aField-seq
在不强制复合唯一索引的情况下是唯一的。
我知道使用 SELECT ... FOR UPDATE
在交易中,
START TRANSACTION
set val = (
select
(ifnull(max(seq),0) + 1)
from sameTable
where
aField = new.aField
for update
);
case
when seq is null then
set seq = val;
else
set seq = seq;
end case;
COMMIT;
将锁定 sameTable
. 虽然,我不知道它是否在一个触发器内工作,但那是另一个问题。
我的问题是:如果我只执行一个查询,它是否会锁定表?最好,为什么?
暂无答案!
目前还没有任何答案,快来回答吧!