pan*_*a82 8 sql postgresql plpgsql
我有一个需要在多个大表上执行长时间更新的函数.在更新期间,一次需要将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;
Run Code Online (Sandbox Code Playgroud)
不幸的是,在plpgsql中没有等效的UNLOCK语句.删除LOCK的常规方法是COMMIT事务,但这在函数内部是不可能的.
这有什么解决方案吗?在函数完成之前显式释放锁的某种方法?或者运行某种子事务(也许通过在单独的函数中运行每个更新)?
UPDATE
我接受了没有解决方案.我将每个更新写入一个单独的函数并从数据库外部进行协调.感谢大家.
有没有办法.Postgres中的函数是原子的(总是在事务中),并且在事务结束时释放锁.而且还没有自主交易.
您可以通过咨询锁解决此问题.但那些不是一回事.所有竞争交易都必须发挥作用.不知道建议锁定的并发访问将破坏该方.
关于dba.SE的代码示例:
或者你可能会遇到与dblink"作弊"自治交易的地方:
或者您重新评估您的问题并将其拆分为几个单独的交易.