【发布时间】:2015-03-11 18:27:26
【问题描述】:
我有一个函数需要对多个大表执行长时间更新。在更新期间,一次需要将 2-3 个表锁定为 EXCLUSIVE 模式。
由于并非所有表都需要同时锁定,理想情况下,我只想锁定我当时正在更新的那些表,然后在完成后解除锁定。
例如。
-- Lock first pair of tables
LOCK TABLE tbl1_a IN EXCLUSIVE MODE;
LOCK TABLE tbl1_b IN EXCLUSIVE MODE;
-- Perform the update on tbl1_a and tbl1_b
-- Release the locks on tbl1_a and tbl1_b
-- HOW???
-- Proceed to the next pair of tables
LOCK TABLE tbl2_a IN EXCLUSIVE MODE;
LOCK TABLE tbl2_b IN EXCLUSIVE MODE;
不幸的是,plpgsql 中没有与 UNLOCK 语句等效的语句。删除 LOCK 的正常方法是 COMMIT 事务,但这在函数内部是不可能的。
有什么解决办法吗?在功能完成之前显式释放锁的某种方式?或者运行某种子事务(也许通过在单独的函数中运行每个更新)?
更新
我接受没有解决方案。我会将每个更新写入一个单独的函数并从数据库外部进行协调。谢谢大家。
【问题讨论】:
标签: sql postgresql plpgsql