【问题标题】:Do stored procedures run in database transaction in Postgres?存储过程是否在 Postgres 的数据库事务中运行?
【发布时间】:2015-03-30 18:48:45
【问题描述】:

如果存储过程在中间失败,那么从 SP 开始时的更改是否会隐式回滚,或者我们是否必须编写任何显式代码以确保 SP 仅在数据库事务中运行?

【问题讨论】:

标签: database postgresql stored-procedures transactions relational-database


【解决方案1】:

严格来说,Postgres 没有stored procedures 在版本 11 之前的 ISO/IEC 标准中定义。该术语经常被错误地用于指代 functions,它提供了许多与其他 RDBMS 提供的“存储过程”相同的功能(甚至更多)。主要区别在于事务处理。

True stored procedures 终于在 Postgres 11 中引入:

Functions 在 Postgres 中是 atomic 并自动在它们自己的事务中运行,除非在外部事务中调用。 它们总是在单个事务中运行并且成功或失败完全因此,不能在函数内开始或提交事务。并且不允许在事务上下文中运行的命令,如 VACUUMCREATE DATABASECREATE INDEX CONCURRENTLY

The manual on PL/pgSQL:

函数和触发过程总是在一个 由外部查询建立的事务——它们无法启动或 提交该事务,因为他们没有上下文 执行。但是,包含EXCEPTION 子句的块 有效地形成一个可以回滚的子事务,而无需 影响外部事务。

Error handling:

默认情况下,PL/pgSQL 函数中发生的任何错误都会中止 函数的执行,实际上是周围事务的执行 也是。您可以使用BEGIN 捕获错误并从中恢复 使用 EXCEPTION 子句阻止。

例外情况,包括但不限于:

【讨论】:

    【解决方案2】:

    来自Postgresql的官方文档:

    在由 CALL 命令调用的过程中以及在匿名代码中 块(DO 命令),可以使用 命令 COMMIT 和 ROLLBACK。新事务开始 使用这些命令结束事务后自动执行,因此 没有单独的 START TRANSACTION 命令。 (请注意,BEGIN 和 END 在 PL/pgSQL 中有不同的含义。)

    https://www.postgresql.org/docs/11/plpgsql-transactions.html

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2012-05-08
      • 2021-07-25
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多