2017-09-25 62 views
1

我的用例是我需要同時執行一個表上的GRANTTRUNCATE語句。爲什麼我不能並行執行截斷和授予語句表?

示例場景:

當我嘗試執行以下並行語句(兩個獨立的終端):

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 

我不不明白錯誤的原因。 TRUNCATE聲明與特權無關。那爲什麼我不能同時執行這些語句?

回答

2

PostgreSQL抱怨的併發更新不是對錶test1的更新,而是對目錄表pg_class的更新。

兩個GRANTTRUNCATEpg_class更新表的行,一個改變relacl和其他改變relfilenode

現在雖然對正常表的更新受鎖保護,但目錄更新並非如此。他們使用某種「樂觀鎖定」其中除首次併發修改之外的所有內容都會導致此錯誤。

現在你可以稱之爲一個錯誤,但我會說,如果你的應用程序中有足夠的併發GRANTTRUNCATE語句,這就成爲一個問題,應用程序出現了問題。

你可能會發現湯姆萊恩的this e-mail關於這個問題的啓發。