Phantomの読み取りを阻止するか、そうでなければPostgresのトランザクションで見つからない行をロックすることは可能ですか?接続2に、Postgresでファントムの読み込みを防ぐには?
CREATE TABLE weather (city varchar(80) PRIMARY KEY);
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO weather VALUES ('a');
一方:
1接続の場合:たとえば、次のコマンドシーケンスを考慮
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM weather WHERE city = 'a' FOR SHARE;
INSERT INTO weather VALUES ('b');
をバック接続1:
COMMIT;
そして再度接続2に戻る:
COMMIT;
SELECT * FROM weather;
-- Shows both rows
行 'b'を作成するための前提条件が行 'a'がないために、接続2のトランザクションが成功することは不可能に思えます。 2番目のトランザクションが成功しないようにするにはどうすればよいですか?テーブル全体をロックせずにそれを行うの
PostgreSQLバージョン? –
psql(PostgreSQL)9.3.11 –
シリアル化可能トランザクションは、その動作がトランザクションの*いくつかのシリアル順序と一致する限り成功する可能性がありますが、この順序付けは、トランザクションの開始またはコミットの順序とは関係ありません。この場合、トランザクション2を実行してからトランザクション1を実行した場合、同じ結果が得られるように見えるので、競合の理由は表示されません。 –