2017-09-25 20 views
1

私は、GRANTTRUNCATEステートメントを同時に実行する必要があることをご存知でしょう。テーブルに対して並列にtruncateとgrant文​​を実行できないのはなぜですか?

サンプルシナリオ:

私は並列に文の下に実行しよう(二つの別々の端子):

while true; do psql -U <user> -d <database> -c 'GRANT select ON test1 TO <user>;'; done 

while true; do psql -U <user> -d <database> -c 'TRUNCATE test1;'; done 

私が手に、次のエラー:

ERROR: tuple concurrently updated 

Iドンエラーの理由を理解できません。 TRUNCATEステートメントは特権とは関係ありません。では、なぜこれらの文を同時に実行できないのですか?

答えて

2

PostgreSQLが抱えている並行更新は、テーブルtest1ではなく、カタログテーブルpg_classの更新ではありません。

両方GRANTTRUNCATEは、pg_classrelfilenodeを変更するrelaclおよびその他を変更するものをテーブルの行を更新しなければなりません。

通常のテーブルの更新はロックで保護されていますが、これはカタログの更新には当てはまりません。彼らは何らかの種類の“オプティミスティックロック”を使用していますが、最初の同時変更を除き、すべてこのエラーが発生します。

これはバグと呼ばれることがありますが、あなたのアプリケーションに十分な同時GRANTTRUNCATEという文がある場合、問題が発生すると考えられます。アプリケーションに問題があります。

啓蒙主義のトム・レーンのthis e-mailが見つかります。

関連する問題