2008-11-25 4 views
5

내가 일하고있는 프로젝트에는 부울 열이 변경되었는지 모니터링하는 "업데이트 중"트리거가있는 테이블이 있습니다 (예 : false -> true = 일부 동작). 그러나이 작업은 한 행에 한 번만 수행 할 수 있습니다.Postgresql 동시성

데이터베이스에 액세스하는 클라이언트가 여러 개 있기 때문에 결국 여러 클라이언트가 같은 행 열을 병렬로 업데이트하려고합니다.

"업데이트"트리거 자체가 동시성을 처리합니까? 아니면 트랜잭션에서 수동으로 테이블을 잠글 필요가 있습니까?

+0

많은 트리거가 동시에 활성화되었을 때 성능이 크게 떨어지는 것을 보았습니까? – ady

답변

17

트리거는 동시성을 처리하지 않으며 PostgreSQL은 명시 적 트랜잭션 사용 여부에 관계없이 올바른 작업을 수행해야합니다.

PostgreSQL은 낙관적 잠금을 사용합니다. 즉, 행을 실제로 업데이트하는 첫 번째 사람이 해당 행을 잠급니다. 두 x 째 사람이 행을 갱신하려고 시도하면, 해당 갱신 명령.은 첫 x ​​째 행이 변경 사항을? L 트하거나 롤백 하는지를 기다립니다.

첫 번째 사람이 커밋하는 경우 두 번째 사람은 변경 사항이 적용되지 않고 오류가 발생하여 흥미로운 변경 내용을 삭제하지 않습니다.

첫 번째 사용자가 롤백하면 두 번째 사용자의 업데이트가 차단 해제되고 정상적으로 진행됩니다. 이제는 아무 것도 덮어 쓰지 않으므로 정상적으로 진행됩니다.

두 번째 사람도 NOWAIT 옵션을 사용할 수 있습니다. 두 번째 사용자는 업데이트가 해결되지 않은 변경과 충돌하는 경우 차단 대신 즉시 오류를 발생시킵니다.

+1

+1 단어 "제거"사용. – swasheck