【发布时间】:2017-11-05 02:19:58
【问题描述】:
我有一个复杂的数据库。我可以这样简化:
表一:
CREATE TABLE a
(
Id int(10) unsigned NOT NULL AUTO_INCREMENT,
A int(11) DEFAULT NULL,
CalcUniqId int(11) DEFAULT NULL,
PRIMARY KEY (Id)
) ENGINE=InnoDB;
CREATE TRIGGER a_before_ins_tr before INSERT on a
FOR EACH ROW
BEGIN
select Max(CalcUniqId) from A into @MaxCalcUniqId;
set new.CalcUniqId=IfNull(@MaxCalcUniqId,1)+1;
END $
它是这样工作的:
start transaction
insert into A(A)
... insert in other tables. It take between 30 and 60 seconds
commit;
问题是,触发器为同时运行的所有事务返回相同的 CalcUniqId。
有什么解决办法或解决办法吗?
这是一个解决方案吗:
start transaction;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
insert into A(A) values(10);
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
....
commit;
人可以运行这个测试:
第 1 节:
Step1: start transaction;
Step2: insert into A(A) values(1);
Step3: commit;
第 2 节:
Step1: start transaction;
Step2: insert into A(A) values(2);
Step3: commit;
在会话 1 中运行步骤 1,2,在会话 2 中运行步骤 1,2。两者都比第 3 步。之后做
select Id, A, CalcUniqId from a;
两者都有相同的 CalcUniqId=2。
【问题讨论】:
-
可能是所有线程都在同时运行
insert,然后排队等待其余的“插入”?还是全部在 30-60 秒后“同时”完成? -
嗨瑞克。我在我的问题中添加了一些文字。谢谢。
标签: mysql transactions innodb mariadb