【问题标题】:Is each plgpsql stored procedure a transaction?每个 plgpsql 存储过程都是事务吗?
【发布时间】:2021-08-18 07:20:47
【问题描述】:

我找不到任何地方对此进行了定义,因此向大家寻求帮助。我在 plgpsql 中有一个长时间运行的存储过程(5 秒),但需要为特定部分放置一个锁,因此计划使用 pg_advisory_xact_lock。但我显然不想锁定整个 5 秒,所以想知道我是否将存储过程分解为 2 个或更多存储过程 - 一个调用其他存储过程的主要存储过程,它如何与事务锁一起工作?每个存储过程是否都算作一个事务,所以当该存储过程完成(提交)时锁会结束?还是整个存储过程调用链都算作一个事务?

即如果我有

procedure A
   call procedure B
   call procedure C
end

如果我在程序 B 中放置一个事务锁,它会在程序 C 开始之前解锁吗?还是会锁定直到过程 A 返回?

感谢您提供的任何帮助或指向我在哪里可以找到此信息的指示。

【问题讨论】:

    标签: sql postgresql concurrency locking plpgsql


    【解决方案1】:

    除非您的存储过程包含 COMMITROLLBACK,否则过程 A 以及从中调用的所有过程都将在单个事务中运行。

    在特殊情况下运行这么长时间的事务是可以的,但如果这是正常情况,您将不会对您的数据库感到满意。

    如果您使用咨询锁,您可以随时释放锁(pg_advisory_unlock),因此无需持有锁直到事务结束。

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      相关资源
      最近更新 更多