1

私はON INSERTPostgreSQL 9.2 にトリガーを持っています。これは何らかの計算を行い、挿入されるすべての行に余分なデータを挿入します。INSERT問題は、2 つのトランザクションを並行して発生させたくないということです。私の計算はインクリメンタルで、以前の計算結果を考慮に入れる必要があるため、それらを 1 つずつ実行する必要があります。どういうわけかこれを達成することは可能ですか?

支払いのリストでローリングバランスを作成しようとしています:

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

は、以前の残高と新しい支払いを足してbalance計算する必要があります。s が並行して発生した場合、列に重複がありますが、これは論理的です。それらを厳密な順序で実行する方法を見つける必要があります。INSERTamountINSERTbalance

4

1 に答える 1

1

SERIALIZABLE主にここで説明されている問題が原因で、トランザクションは役に立ちませんでした。ほとんどのトランザクションでエラーが発生するだけです: could not serialize access due to read/write dependencies among transactions.

助けになったのは、LOCKevery の前の明示的なものでしたINSERT:

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

その結果、すべての挿入が現在行われています。

于 2013-09-20T19:15:27.823 に答える