首页 > 解决方案 > PostgreSQL - 隐式事务模拟

问题描述

我正在使用来自 RDS (AWS) 的 PostgreSQL 10。所以请注意,我没有完全的权限来做任何我想做的事情。

在 PostgreSQL 中,我有一些用 PL/pgSQL 编写的函数。

根据我在这些功能中的经验,我无法启动/提交/回滚事务。在一个DO街区我也不能这样做。

那是对的吗?那么这背后的逻辑是什么......似乎PostgreSQL希望在现有事务的上下文中调用每个函数。正确的?

但是,如果我希望函数中的每个语句都在单独的(短)事务中执行,即具有类似于 AUTOCOMMIT = ON 的行为,该怎么办?

我发现了一些可能可以做到这一点的扩展,但我不确定。我不知道这是否相关。 https://www.postgresql.org/docs/10/ecpg-sql-set-autocommit.html

在不需要下载和安装额外的包/扩展的情况下,在 Postgres 中没有这样做的标准方法吗?

同样:我希望函数中的每个语句都在单独的(短)事务中执行,即具有类似于 AUTOCOMMIT = ON 的行为。

所以我想要这样的东西: https ://docs.microsoft.com/en-us/sql/t-sql/statements/set-implicit-transactions-transact-sql?view=sql-server-2017

标签: postgresqltransactionsstored-functions

解决方案


一个函数中的所有语句都在同一个事务中运行,没有插件可以改变它。

您可以使用从 v11 开始的过程,但您仍然必须显式管理事务。

我怀疑最好的办法是在数据库客户端上运行你的函数,在那里你可以自动提交,而不是作为数据库中的一个函数。


推荐阅读