1

外部テーブルを使用して2つのpostgresqlデータベースをリンクしようとしています

すべて問題なく、必要なすべてのデータを取得できます

唯一の問題は、データ ラッパーが外部サーバーのテーブルをロックしているように見え、コードを単体テストするときに非常に煩わしいことです

選択要求を行わない場合、データを初期化し、ローカル サーバーのテーブルとリモート サーバーのテーブルの両方を切り捨てることができますが、1 つの選択ステートメントを実行すると、リモート サーバーの切り捨てコマンドがデッドロック状態になるようです

このロックを回避する方法を知っていますか?

ありがとう

[編集]

このデータ ラッパーを使用して、2 つの postgresql データベースをリンクします: http://interdbconnect.sourceforge.net/pgsql_fdw/pgsql_fdw-en.html

db1 の table1 を db2 の外部テーブルとして使用します

db2のforeign_table1で選択クエリを実行すると、db1のtable1のAccessShareLockがありますクエリは非常に簡単です:select * from foreign_table1

ロックは解放されないため、単体テストの最後に切り捨てコマンドを実行すると、切り捨てが AccessExclusiveLock を追加するため、競合が発生します。

最初の AccessShareLock を解放する方法はわかりませんが、ラッパーによって自動的に行われると思います...

この助けを願っています

4

1 に答える 1

1

AccessExclusiveLockとAccessShareLockは、通常、明示的に取得されません。それらは、特定の通常のステートメントによって自動的に取得されます。ロックを参照してください-ロックリストには、どのステートメントがどのロックを取得するかが示されています。

アクセス共有

ACCESSEXCLUSIVEロックモードとのみ競合します。

SELECTコマンドは、参照されるテーブルでこのモードのロックを取得します。一般に、テーブルを読み取るだけでテーブルを変更しないクエリは、このロックモードを取得します。

これが意味するのは、最初のトランザクションがまだコミットまたはロールバックされていない(したがって、ロックが解放されていない)ため、2番目のトランザクションは。と競合する必要があるTRUNCATEためテーブルにできないということです。TRUNCATEACCESS EXCLUSIVEACCESS SHARE

最初のトランザクションがコミットまたはロールバックすることを確認してください。

ところで、「外部」データベースは実際にはローカルデータベースですか。つまり、自律型トランザクションをシミュレートするためにdblinkの代わりにpgsql_fdwを使用していますか?

于 2012-10-08T09:32:31.977 に答える