查了PG11 的文档 https://www.postgresql.org/docs/current/plpgsql-transactions.html,没找出原因.
过程 dm.sp_log_create 做的 是 insert 然后 commit,报错 是在 commit这一句报错
相比 oracle,PG11上的procedure的事务支持 限制条件多,我查了相关文档,已经避开找到注意事项,还是不行,摸不着头脑[流泪]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到在PostgreSQL 11中使用存储过程(Procedure)时,在执行COMMIT
语句报错的情况,可能与几个因素相关。虽然PostgreSQL的PL/pgSQL确实允许在存储过程中显式地控制事务,但通常推荐让调用者来管理事务,因为自动提交模式下,存储过程中的COMMIT
和ROLLBACK
可能会受到限制或不按预期工作。特别是当存储过程被其他事务上下文调用时,内部的提交操作可能会与外部事务管理冲突。
以下是一些可能导致问题的原因及建议:
权限问题:确保调用该存储过程的用户具有足够的权限来执行COMMIT
。虽然这通常不是问题,但如果数据库配置了非常严格的权限管理,这可能是原因之一。
自动提交模式:如果连接到数据库的客户端或应用程序框架默认开启了自动提交模式(如某些ORM工具或JDBC连接默认设置),尝试在存储过程中手动控制事务可能会导致异常。确认调用环境是否支持或需要手动事务控制。
嵌套事务:如果存储过程是在另一个事务中被调用的,那么内部的COMMIT
可能不被允许,因为外部事务尚未完成。PostgreSQL不支持真正的嵌套事务,而是遵循一个顶层事务的概念。
异常处理:检查你的存储过程是否有正确的异常处理逻辑。在PL/pgSQL中,未被捕获的异常会自动回滚当前事务,因此在COMMIT
前确保所有可能抛出异常的操作都被妥善处理。
文档细节:虽然你已经查阅了文档,但可能有一些特定于版本或配置的注意事项没有注意到。重新审视文档中关于事务处理的部分,特别是与PostgreSQL 11相关的任何已知问题或限制。
日志查看:详细查看错误日志,了解具体的错误信息。这将提供更直接的线索来解决问题。
替代方案:考虑是否真的需要在存储过程中进行显式提交。通常,最佳实践是让调用者负责开始和结束事务,这样可以简化存储过程,并减少潜在的交互问题。
如果你已经检查了上述方面仍然无法解决问题,建议分享具体的错误消息以及存储过程的简化代码示例,以便获得更针对性的帮助。