2017-06-06 6 views
0

私はpostgresqlを初めて使用し、アドバイザリ・ロックを理解しようとしています。 (期待されるように動作します)postgresqlのアドバイザリー・ロック・スコープ

セッション1:SELECT pg_advisory_lock(1);が正常に異なるでロック

セッション2(注を取得二つの異なるセッションで異なるデータベースで

  1. :私は、次の2つのシナリオを持っていますSELECT pg_advisory_lock(1);ロックを取得しました

  2. 同じデータベース内の異なるスキーマを使用して同じ操作を行うと、2番目の「セッション」ブロックがブロックされます。

アドバイザリロックは(データベースとスキーマの)組み合わせではなくデータベースレベルで動作するようです。私の前提は正しいのですか、または私が紛失しているものはありますか?

+0

"(データベースとスキーマ)ではなく、---クエリのどこにでもスキーマを指定しません。これが真実であると仮定すると、ロックを取得するスキーマはどのように分かりますか? – zerkms

+0

データベースごとに通常のロックと同じ「範囲」を持ちます –

答えて

1

では、postgresスキーマは名前空間です。プレフィックスだけでなく、別のデータベースよりも少ない。 2あなたのケースでは、第2セッションではない「ブロック」のではなく、per docsとして待っている:リソースが利用可能 なるまで

別のセッションがすでに同じリソース 識別子のロックを保持している場合、この関数は待機します。

異なるデータベースに成功したロックについて: ターゲットは、一般的なデータベースオブジェクトでない場合は、そのシステムカタログ、またはnull内SELECT pg_advisory_lock(1);チェックアウトpg_locks、ロック対象のcolumn objid

OIDを実行した後

ので、この数は、データベースごとです - あなたは多くのダ用同じを参照することができますtabases - それらは異なるOIDになります。

関連する問題