开发者社区 问答 正文

各位,请教个问题,PG11 开始 procedure 开始支持 事务管理,也就是说里面可以 commit了,但我写的这个语句为什么不可以,能帮忙看下是啥问题吗?

查了PG11 的文档 https://www.postgresql.org/docs/current/plpgsql-transactions.html,没找出原因.
image
过程 dm.sp_log_create 做的 是 insert 然后 commit,报错 是在 commit这一句报错
相比 oracle,PG11上的procedure的事务支持 限制条件多,我查了相关文档,已经避开找到注意事项,还是不行,摸不着头脑[流泪]

展开
收起
我叫石头 2019-03-28 13:40:02 3062 分享 版权
阿里云 AI 助理回答

遇到在PostgreSQL 11中使用存储过程(Procedure)时,在执行COMMIT语句报错的情况,可能与几个因素相关。虽然PostgreSQL的PL/pgSQL确实允许在存储过程中显式地控制事务,但通常推荐让调用者来管理事务,因为自动提交模式下,存储过程中的COMMITROLLBACK可能会受到限制或不按预期工作。特别是当存储过程被其他事务上下文调用时,内部的提交操作可能会与外部事务管理冲突。

以下是一些可能导致问题的原因及建议:

  1. 权限问题:确保调用该存储过程的用户具有足够的权限来执行COMMIT。虽然这通常不是问题,但如果数据库配置了非常严格的权限管理,这可能是原因之一。

  2. 自动提交模式:如果连接到数据库的客户端或应用程序框架默认开启了自动提交模式(如某些ORM工具或JDBC连接默认设置),尝试在存储过程中手动控制事务可能会导致异常。确认调用环境是否支持或需要手动事务控制。

  3. 嵌套事务:如果存储过程是在另一个事务中被调用的,那么内部的COMMIT可能不被允许,因为外部事务尚未完成。PostgreSQL不支持真正的嵌套事务,而是遵循一个顶层事务的概念。

  4. 异常处理:检查你的存储过程是否有正确的异常处理逻辑。在PL/pgSQL中,未被捕获的异常会自动回滚当前事务,因此在COMMIT前确保所有可能抛出异常的操作都被妥善处理。

  5. 文档细节:虽然你已经查阅了文档,但可能有一些特定于版本或配置的注意事项没有注意到。重新审视文档中关于事务处理的部分,特别是与PostgreSQL 11相关的任何已知问题或限制。

  6. 日志查看:详细查看错误日志,了解具体的错误信息。这将提供更直接的线索来解决问题。

  7. 替代方案:考虑是否真的需要在存储过程中进行显式提交。通常,最佳实践是让调用者负责开始和结束事务,这样可以简化存储过程,并减少潜在的交互问题。

如果你已经检查了上述方面仍然无法解决问题,建议分享具体的错误消息以及存储过程的简化代码示例,以便获得更针对性的帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答