2016-08-03 61 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

如果一切正常,我在一個Begin -承諾;塊。這會結束交易嗎?BEGIN; \t LOCK TABLE my_table IN ACCESS EXCLUSIVE MODE; \t SELECT my_function(); COMMIT; –

+0

@MukundGandlur:如果您從調用代碼提交或回滾,函數內部的保存點並不是真的需要。只要確保你確實結束了交易。 –