4

質問があります。トランザクション分離レベルはシリアル化可能に設定されています。1人のユーザーがトランザクションを開き、「table1」のデータをINSERTまたはUPDATEしてから、別のユーザーがトランザクションを開いて同じテーブルにデータを挿入しようとした場合、2番目のユーザーは最初のユーザーがトランザクションをコミットするまで待つ必要がありますか?

4

2 に答える 2

3

一般的にはありません。2番目のトランザクションは挿入のみであるため、実行する必要のある一意のインデックスチェックまたはその他のトリガーがない限り、データを無条件に挿入できます。一意のインデックス(主キーを含む)の場合、両方のトランザクションが同じ値の行を更新している場合はブロックされます。例:

-- Session 1                           -- Session 2
CREATE TABLE t (x INT PRIMARY KEY);
BEGIN;
INSERT INTO t VALUES (1);
                                       BEGIN;
                                       INSERT INTO t VALUES (1);  -- blocks here
COMMIT;
                                       -- finally completes with duplicate key error

他のトランザクションによる挿入に影響を与える可能性のある更新の場合、状況はそれほど明白ではありません。この場合、PostgreSQLはまだ「真の」直列化可能性をサポートしていないことを理解しています。他のSQLシステムでどれほど一般的にサポートされているかわかりません。

http://www.postgresql.org/docs/current/interactive/mvcc.htmlを参照してください

于 2010-06-10T02:51:37.327 に答える
-1

2番目のユーザーは、最初のユーザーが変更をコミットまたはロールバックするまでブロックされます。

于 2010-06-10T02:46:17.017 に答える