我正在寫一個函數,它鎖定到一個表並執行更新操作。在這裏我使用一個擴展來散列一個字符串,這裏有一個錯誤的機會。postgres鎖如何得到釋放異常
現在我的問題是。如何確保在發生異常情況下鎖定被釋放?
我正在使用「IN ACCESS EXCLUSIVE」模式中的鎖。
我正在寫一個函數,它鎖定到一個表並執行更新操作。在這裏我使用一個擴展來散列一個字符串,這裏有一個錯誤的機會。postgres鎖如何得到釋放異常
現在我的問題是。如何確保在發生異常情況下鎖定被釋放?
我正在使用「IN ACCESS EXCLUSIVE」模式中的鎖。
通常在交易結束時釋放一個鎖。作爲一個功能不能做交易處理你不能真正釋放鎖在的功能。調用函數的代碼必須正確提交或回滾事務才能釋放鎖定。
另一種選擇是在獲取鎖之前使用保存點。在這種情況下,您可以回滾到異常處理程序中的保存點以釋放鎖定。
begin
savepoint before_lock;
lock table foo in exclusive mode;
... do stuff
exception
when others then
rollback to before_lock;
end;
請注意,如果一切正常(當前事務也不會結束),這將不會釋放鎖。您仍然需要在調用函數的代碼中結束交易
如果一切正常,我在一個Begin -承諾;塊。這會結束交易嗎?BEGIN; \t LOCK TABLE my_table IN ACCESS EXCLUSIVE MODE; \t SELECT my_function(); COMMIT; –
@MukundGandlur:如果您從調用代碼提交或回滾,函數內部的保存點並不是真的需要。只要確保你確實結束了交易。 –
交叉帖子:https://dba.stackexchange.com/q/145708/1822 –