我正在编写一个锁定到表并执行更新操作的函数。在这里,我使用扩展来散列字符串,这里有可能出错。
现在我的问题是。如果发生异常,如何确保锁定被释放?
我在“IN ACCESS EXCLUSIVE”模式下使用锁。
答案 0 :(得分:1)
通常在交易结束时释放锁定。由于某项功能无法进行交易处理,因此您无法在该功能中释放锁定 。调用该函数的代码必须正确提交或回滚事务才能释放锁。
另一种选择是在获取锁之前使用保存点。在这种情况下,您可以回滚到异常处理程序中的保存点以释放锁定。
begin
savepoint before_lock;
lock table foo in exclusive mode;
... do stuff
exception
when others then
rollback to before_lock;
end;
请注意,如果一切正常,这将不会释放锁定(当前交易也不会结束)。您仍然需要在调用函数
的代码中结束事务