2017-09-25 1 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 하나는 relacl 변경하고 다른 하나는 relfilenode을 변경, pg_class 테이블의 행을 업데이트해야합니다.

이제 일반 테이블에 대한 업데이트가 잠금으로 보호되지만 카탈로그 업데이트에는 해당되지 않습니다. 그들은 일종의 “ 낙관적 인 잠금 ”을 사용합니다. 여기서 첫 번째 동시 수정을 제외한 모든 오류로 인해이 오류가 발생합니다.

이제는이 문제를 버그라고 부르 겠지만 응용 프로그램에 GRANTTRUNCATE 문이 동시 발생하여 문제가되는 경우 응용 프로그램에 문제가 있다고 말할 수 있습니다.

주제에 대해 톰 레인의 this e-mail을 발견 할 수 있습니다.

관련 문제