他の質問で提案されているトランザクション分離に関するpostgresのドキュメントを徹底的に読んでいますが、「述語のロック」についてはまだ理解できていません。
誰かが私を啓発できることを願っています:-)
ドキュメントによると: PostgreSQL の述語ロックは、他のほとんどのデータベース システムと同様に、トランザクションによって実際にアクセスされるデータに基づいています。
それは良さそうですが、なぜ次のようなことが起こっているのでしょうか?
CREATE TABLE mycustomer(cid integer PRIMARY KEY, licenses integer);
CREATE TABLE mydevice(id integer PRIMARY KEY, cid integer REFERENCES
mycustomer (cid), status varchar(10));
INSERT INTO mycustomer(cid, licenses) VALUES (1, 5);
INSERT INTO mycustomer(cid, licenses) VALUES (2, 5);
Request 1 Request2
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
BEGIN TRANSACTION ISOLATION
LEVEL SERIALIZABLE;
SELECT * from mydevice where cid = 1;
SELECT * from mydevice where cid = 2;
INSERT INTO mydevice(id, cid, status)
VALUES (1, 1, 'ok');
INSERT INTO mydevice(id, cid, status)
VALUES (2, 2, 'ok');
commit;
(=ok)
commit;
(=rollback)
リクエスト 1 とリクエスト 2 からの挿入は以前の読み取りと競合しないため、エラーが発生することはないことを理解しています。「エラー: トランザクション間の読み取り/書き込みの依存関係のため、アクセスをシリアル化できませんでした」というメッセージが表示されるのはなぜですか。
ご想像のとおり、すべての同時リクエストはその詳細に関係なくロールバックされるため、前述の動作が発生することはありません。私のビジネス シナリオでは、同じ単一の顧客のデータを (例のデバイスに従って) 挿入しているときにのみ、同時要求をロールバックしたいと考えています。
これらの操作は Java アプリケーションから実行されます。原則として、ニーズを満たすためにロック テーブルを作成することを考えています。何か案は?
どうもありがとう!