插入期间使用select as value时的并发性

3pmvbmvn  于 2021-08-01  发布在  Java
关注(0)|答案(0)|浏览(229)

我在一个 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 . 虽然,我不知道它是否在一个触发器内工作,但那是另一个问题。
我的问题是:如果我只执行一个查询,它是否会锁定表?最好,为什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题