2017-12-07 4 views
0

私はそのバージョンを含むレコードを1つ持っています(最初は1)。 200同時ユーザーが同じレコードを更新していて、すべての更新バージョンが1だけ増加する必要があります。すべてが適切であれば、バージョンは200でなければなりません。ポストグルで200人の同時ユーザーのレコードを1つ更新する

レコードを正しく更新できません。

Max connection pool size = 50 
Database = Postgres 

お願いします。 ありがとうございました:)

+0

データベースプロシージャを200回コールできます –

+0

バージョン番号をどのように更新しますか?トランザクションのシリアライゼーションレベルをシリアライズ可能に設定すると問題が解決されると思います。 – MTilsted

+0

TRANSACTION_SERIALIZABLEを設定しても、以下の問題が発生しています - org.postgresql.util.PSQLException:ERROR:同時更新によるアクセスをシリアル化できませんでした。 –

答えて

0

ここでは何も複雑にする必要はなく、明示的なトランザクション管理は必要ありません。

すべての関与のセッションがちょうどデフォルトで

UPDATE mytab 
SET version=version+1 
WHERE key=42 
RETURNING version; 

を発行し、各ステートメントが独自のトランザクションで実行され、これらの取引は、行に排他ロックで互いをロックアウトされますので、彼らは自動的にシリアライズされます。

+0

TRANSACTION_SERIALIZABLEを設定しましたが、以下の問題が発生しました。 - org.postgresql.util.PSQLException:エラー:同時更新によるアクセスをシリアル化できませんでした。 –

+0

私はそれをより明確にするために私の答えを編集しました(私が望む)。明示的な取引の必要はありません。もちろん、他の理由でトランザクションが必要な場合もあります。分離レベルでは、 'REPEATABLE READ'とそれ以上のシリアライゼーションエラーが発生する可能性があります。つまり、トランザクションを再試行する必要があります。競合が多すぎる場合、これらの分離レベルで使用される「オプティミスティック・ロック」アプローチは適切ではなく、明示的に表をロックする必要があります。 –

+0

ありがとう –

関連する問題