通过触发器同时触发功能

时间:2020-10-14 08:13:55

标签: postgresql triggers

我在PostgreSQL中创建了触发器,该触发器可能会在一瞬间触发多次。 该触发器正在调用另一个函数以将数据插入表中。 有一个选择语句从表说 TableA 来找到相应记录的 id (通过返回语句并保存在变量中),然后我必须在其他表中插入多行引用此 id 的表说 TableB

我的问题是:此变量保留 Id ,有时在 TableB 中插入错误的值。 据我了解(可能是错误的),此变量值在插入过程中会发生变化(同时触发再次触发)。

喜欢

declare Id integer;
select keyID INTO Id from tableA;
INSERT INTO TableB (Id, date) values (Id, now());

任何人都可以解释一下,在这种情况下到底是什么问题。 如果提供解决方案将很感激

1 个答案:

答案 0 :(得分:1)

触发器在与触发它的语句相同的事务中运行,并且它看不到当前正在运行的其他事务的效果(没有“脏读”)。

因此,如果两个数据修改语句同时运行,则同时运行的触发器函数将无法“看到”另一个事务的修改,并且最终可能会导致结果,如果执行了这些操作就永远不可能发生一个接一个地执行。这称为异常

默认的READ COMMITTED隔离级别无法保护您免受此类异常的影响,REPEATABLE READ也不能。仅当所有事务都使用SERIALIZABLE隔离级别时,才不会发生异常。在这种情况下,其中一个事务将因序列化错误而中止,必须重复执行。

另一种方法是使用SELECT ... FOR UPDATE来锁定读取行。然后,您可以使用READ COMMITTED隔离,但是这些锁对于并发不利,并且可能导致死锁,这也导致涉及的事务之一终止。