ロックがPostgresのトランザクションとどのようにやりとりするのか理解できません。Postgresがトランザクション内でロックする
私はこの(長い)クエリを実行すると、私は起こるロックの高度さに驚いています:\COPY
ためは、それが必要とロックのレベルは言及しませんが、this postが示す
BEGIN;
TRUNCATE foo;
\COPY foo FROM 'backup.txt';
COMMIT;
RowExclusiveLockを取得するだけです。私は\COPY
中にこのクエリを実行するときしかし:
SELECT mode, granted FROM pg_locks
WHERE relation='foo'::regclass::oid;
私はこれを取得:
一体AccessExclusiveLockから来ていることであるmode granted
RowExclusiveLock true
ShareLock true
AccessExclusiveLock true
?私はそれがTRUNCATE
から来ていると仮定します。それはrequires an AccessExclusiveLockです。しかし、TRUNCATE
はすばやく終了するので、ロックもすぐに解放されると思います。これは私にいくつかの質問を残す。
トランザクション内のコマンドによってロックが取得された場合、コマンドの終了時(トランザクションの終了前)にロックが解除されますか?もしそうなら、なぜ私は上記の行動を観察するのですか?そうでない場合は、どうしてですか?実際、transactions don't touch the table until the COMMIT
以降、トランザクションでTRUNCATE
はなぜテーブルをブロックする必要がありますか?
PGのtransactionsについてはdocumentationでこれ以上の議論はありません。
ありがとう、@Laurenz!私はトランザクション内の 'TRUNCATE'がどのように動作するのかを突き止めるためにまだ苦労しています。 "TRUNCATE"が実際にテーブルを空にし、 "ROLLBACK"がテーブルに触れていない "場合、TRUNCATEはどのようにロールバックされますか? –
「ダーティーリード」の意味を理解することも難しいです([docs](https://www.postgresql.org/docs/current/static/transaction-iso.html)に記載されています)それは恐らくそれ自身の疑問を正当化するだろう。 –
私は「ダーティリード」と説明し、リンクを追加しました。あなたは、私の説明が「TRUNCATE」に関して少し矛盾しているのは間違いありません。 [コードの説明](https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/commands/tablecmds.c;h=f97bee5b0e464265e2af103053800900f40058ff;hb=HEAD #l1214)、古いテーブルはすぐに破棄されるのではなく、コミット時に破棄されるので、 'COMMIT'はテーブルに正確に触れるのではなく、削除します。私は私の説明でそれをより明確にしようとします。 –