2016-08-03 3 views
0

테이블에 고정되어 업데이트 작업을 수행하는 함수를 작성하고 있습니다. 그리고 여기에 문자열을 해시하는 확장을 사용하고 있으며 여기에 오류가 발생할 수 있습니다.예외가 발생하면 postgres 잠금이 해제됩니다.

이제 제 질문입니다. 예외가 발생하면 잠금이 해제되는지 어떻게 확인합니까?

"IN ACCESS EXCLUSIVE"모드에서 잠금을 사용하고 있습니다.

+0

크로스 게시 : https://dba.stackexchange.com/q/145708/1822 –

답변

1

잠금은 일반적으로 트랜잭션이 끝날 때 해제됩니다. 함수는 트랜잭션 처리를 할 수 없으므로에있는 잠금 을 실제로 해제 할 수는 없습니다. 함수를 호출하는 코드는 잠금을 해제하기 위해 트랜잭션을 올바르게 커밋하거나 롤백해야합니다.

또 다른 옵션은 잠금을 획득하기 전에 전에 세이브 포인트 을 사용하는 것입니다. 이 경우 예외 핸들러의 세이브 포인트로 롤백하여 잠금을 해제 할 수 있습니다.

begin 
    savepoint before_lock; 
    lock table foo in exclusive mode; 
    ... do stuff 
exception 
    when others then 
    rollback to before_lock; 
end; 

모든 것이 정상이면 (현재 트랜잭션이 종료되지 않음) 잠금이 해제되지 않습니다. 함수를 호출하는 코드에서 트랜잭션을 종료해야합니다.

+0

모든 항목이 정상적으로 작동하는 경우 시작에서 함수를 호출합니다. -범하다; 블록. 그 거래를 끝내시겠습니까? \t LOCK TABLE my_table in ACCESS EXCLUSIVE MODE; \t SELECT my_function(); COMMIT; –

+0

@MukundGandlur : 호출 코드에서 커밋하거나 롤백하면 함수 내의 세이브 포인트가 실제로 필요하지 않습니다. 거래를 제대로 끝내야합니다. –

관련 문제