在PostgreSQL中故意引发异常是件好事吗?
我在Postgres中开发一个PL函数,在其中我根据一些逻辑修改表的记录,然后执行一个最终查询(基本上是计数),如果得到的数字是正数,我抛出一个异常以回滚事务(因为PostgreSQL的函数不显式支持事务) 那么,这是模拟事务的好方法吗?你有更好的建议吗在PostgreSQL中故意引发异常是件好事吗?,sql,postgresql,postgresql-9.2,Sql,Postgresql,Postgresql 9.2,我在Postgres中开发一个PL函数,在其中我根据一些逻辑修改表的记录,然后执行一个最终查询(基本上是计数),如果得到的数字是正数,我抛出一个异常以回滚事务(因为PostgreSQL的函数不显式支持事务) 那么,这是模拟事务的好方法吗?你有更好的建议吗 PS:我正在使用PostgreSQL 9.2,但如果这能有所帮助的话,我很快就要迁移到9.3了。我以前使用过这个解决方案。问题在于PLPGSQL语言不支持使用保存点和回滚。事务包装函数,而不是相反 RAISE是通知客户某个职能部门内部状况的适当
PS:我正在使用PostgreSQL 9.2,但如果这能有所帮助的话,我很快就要迁移到9.3了。我以前使用过这个解决方案。问题在于PLPGSQL语言不支持使用保存点和回滚。事务包装函数,而不是相反 RAISE是通知客户某个职能部门内部状况的适当方法。有几种级别的提升,“最坏的”是异常,它将中止/回滚事务,除非有什么东西捕获并抑制异常 对于测试,使用 `RAISE DEBUG 'some comment %', var;` `提出调试“某些注释%”,var`
如果您想在日志中添加一些内容,但又不想回滚,则可以(通常)发出警告。(任何级别的加薪都可以进入您的日志,这取决于您的配置)我过去使用过此解决方案。问题在于PLPGSQL语言不支持使用保存点和回滚。事务包装函数,而不是相反 RAISE是通知客户某个职能部门内部状况的适当方法。有几种级别的提升,“最坏的”是异常,它将中止/回滚事务,除非有什么东西捕获并抑制异常 对于测试,使用 `RAISE DEBUG 'some comment %', var;` `提出调试“某些注释%”,var`
如果您想在日志中添加一些内容,但又不想回滚,则可以(通常)发出警告。(任何级别的提升都可以进入日志,这取决于您的配置)如果您希望中止函数中的事务,那么是的,引发异常是一个不错的选择 您可以通过使用
BEGIN。。。异常
功能内的块。使用内部开始。。。异常
块,并在其中引发带有用户定义的SQLSTATE的异常。在异常
块中捕获异常
开始中的升高(错误或更高)
。。。异常
块将回滚在该块中完成的工作,就像您使用了保存点
和回滚到保存点
一样
函数不能强制回滚顶级事务;如果您引发
异常,外部pl/pgsql函数可以在开始中捕获异常。。。异常
块,或者客户端可以使用回滚到保存点
如果您希望中止函数中的事务,那么是的,引发异常是一个不错的选择
您可以通过使用BEGIN。。。异常
功能内的块。使用内部开始。。。异常
块,并在其中引发带有用户定义的SQLSTATE的异常。在异常
块中捕获异常
开始中的升高(错误或更高)
。。。异常
块将回滚在该块中完成的工作,就像您使用了保存点
和回滚到保存点
一样
函数不能强制回滚顶级事务;如果您引发
异常,外部pl/pgsql函数可以在开始中捕获异常。。。异常
块,或者客户端可以使用与“仿真事务”无关的回滚到保存点
。这是一种简单的错误处理方法,也是正确的方法——否则,调用者怎么知道出了问题。我甚至可能在允许您在存储过程中提交的DBMS中这样做。顺便说一句:您的声明“不明确支持事务”有点不准确。函数中的语句是完全事务性的:它们是调用方事务的一部分,但不允许自己提交或回滚该事务。这与“模拟事务”无关。这是一种简单的错误处理方法,也是正确的方法——否则,调用者怎么知道出了问题。我甚至可能在允许您在存储过程中提交的DBMS中这样做。顺便说一句:您的声明“不明确支持事务”有点不准确。函数中的语句是完全事务性的:它们是调用方事务的一部分,但不允许提交
或回滚
该事务。谢谢,这比使整个函数引发异常要好得多!但是,为了澄清,任何提升级别都会导致begin exception块回滚已完成的工作或仅回滚异常???@FearUsERROR
或更大。谢谢,这比让整个函数抛出异常要好得多!但是,为了澄清,任何提升级别都会导致begin异常块回滚已完成的工作或仅回滚异常???@FearUsERROR
或更高。