如何在PostgreSQL中禁止并行插入?

如何在PostgreSQL中禁止并行插入?,postgresql,postgresql-9.2,Postgresql,Postgresql 9.2,在PostgreSQL 9.2中,我有一个关于INSERT的触发器,它执行一些计算并向插入的每一行注入额外的数据。问题是我不希望任何两个INSERT事务同时发生。我希望它们一个接一个地进行,因为我的计算必须是增量的,并考虑到以前的计算结果。有可能以某种方式实现这一点吗 我试图在付款清单上创建滚动余额: id | amount | balance ---------------------- 1 | 50 | 50 2 | 130 | 180 3 | -

在PostgreSQL 9.2中,我有一个关于INSERT的
触发器,它执行一些计算并向插入的每一行注入额外的数据。问题是我不希望任何两个
INSERT
事务同时发生。我希望它们一个接一个地进行,因为我的计算必须是增量的,并考虑到以前的计算结果。有可能以某种方式实现这一点吗

我试图在付款清单上创建滚动余额:

id | amount | balance
----------------------
 1 |     50 |      50
 2 |    130 |     180
 3 |    -75 |     105
 4 |     15 |     120

必须在每次插入
时计算
余额,将其作为以前的余额加上新的付款
金额。如果
INSERT
s并行发生,则
balance
列中有重复项,这是合乎逻辑的。我需要找到一种方法来强制它们以严格的顺序执行。

可序列化的
事务没有帮助,主要是因为解释了问题。我只是在大多数事务上出错:
无法序列化访问,因为事务之间存在读/写依赖关系

有帮助的是在每次插入
之前都有一个明确的

LOCK TABLE receipt IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO receipt ...

因此,现在所有的插入都发生了。

SERIALIZABLE
事务没有帮助,主要是因为所解释的问题。我只是在大多数事务上出错:
无法序列化访问,因为事务之间存在读/写依赖关系

有帮助的是在每次插入
之前都有一个明确的

LOCK TABLE receipt IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO receipt ...

所有插入操作现在都在进行。

您可以“动态”计算该平衡。为什么你认为你需要一个触发器?这是一个数百万条记录的表,“动态”需要很多秒,因为我的实际例子更复杂,而且这个
balance
列的计算方式更复杂。我可以想出两种可能的方法:使事务序列化或在插入之前锁定表(你知道窗口函数计算运行和的能力吗?)是的,听起来像是这样。你可以“在运行中”计算平衡。你为什么认为你需要一个触发器?这是一个数百万的记录表,“在运行中”需要很多秒,因为我的实际示例更复杂,而且此
余额
列的计算方式更复杂,我可以想出两种可能的方法:使事务可序列化或在插入之前锁定表(您知道窗口函数计算运行和的能力吗?)是的,听起来像是这样。
LOCK
s是解决这一问题的清晰/特定方法,但性能方面非常沉重。
SERIALIZE
理想情况下应该在重试循环中进行尝试,然后您的观察结果非常正常,只是您最终服用的毒药显然取决于可以接受的缺点。
LOCK
s是解决这一问题的明确/特定方法,但性能方面非常重要。
SERIALIZE
理想情况下应该在重试循环中进行尝试,然后您的观察结果是非常正常的,只是您最终服用的毒药显然取决于可以接受的缺点。