如何在PostgreSQL中禁止并行INSERT?

时间:2013-09-20 15:36:31

标签: postgresql postgresql-9.2

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

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

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

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

1 个答案:

答案 0 :(得分:1)

SERIALIZABLE交易没有帮助,主要是因为here解释了问题。我只是在大多数交易中遇到错误:could not serialize access due to read/write dependencies among transactions

在每个LOCK

之前,有什么帮助是明确的INSERT
LOCK TABLE receipt IN SHARE ROW EXCLUSIVE MODE;
INSERT INTO receipt ...

现在正在进行所有插入。