4

JDBC を使用した postgres データベースのテーブルのロックに関する簡単な質問です。新しいレコードを追加したいテーブルがありますが、主キーに対してこれを行うには、増加する整数値を使用します。

この列の最大値をJavaで取得し、それを変数として保存して、新しい行を追加するときに新しい主キーとして使用できるようにしたいと考えています。

これは、マルチユーザー システムとしてモデル化されるため、小さな問題が発生します。2 つの場所が同じ最大値を要求するとどうなりますか? もちろん、同じ主キーを追加しようとすると問題が発生します。

キーを取得して新しい行を追加する際の読み取りまたは書き込みを防ぐために、テーブルで排他ロックを使用する必要があることに気付きました。ただし、JDBC でテーブルのロックを処理する方法を見つけることができないようです。標準のトランザクションだけです。

そのような疑似コード:

primaryKey = "SELECT MAX(id) FROM table1;";
primary key++;
//id retrieved again from 2nd source

"INSERT INTO table1 (primaryKey, value 1, value 2);"
4

1 に答える 1

5

おっしゃる通り、2 つの場所がほぼ同時にリクエストを行うと、競合状態が発生します。

これを処理する方法は、postgres でシーケンスを作成し、nextval を主キーとして選択することです。

どの方向に向かっているのか、データをどのように処理しているのか正確にはわかりませんが、列をシリアルとして設定し、挿入クエリに列を含めないこともできます。列は自動的に自動インクリメントされます。

于 2013-03-29T19:07:31.893 に答える