在PostgreSQL中故意引发异常是件好事吗?

在PostgreSQL中故意引发异常是件好事吗?,sql,postgresql,postgresql-9.2,Sql,Postgresql,Postgresql 9.2,我在Postgres中开发一个PL函数,在其中我根据一些逻辑修改表的记录,然后执行一个最终查询(基本上是计数),如果得到的数字是正数,我抛出一个异常以回滚事务(因为PostgreSQL的函数不显式支持事务) 那么,这是模拟事务的好方法吗?你有更好的建议吗 PS:我正在使用PostgreSQL 9.2,但如果这能有所帮助的话,我很快就要迁移到9.3了。我以前使用过这个解决方案。问题在于PLPGSQL语言不支持使用保存点和回滚。事务包装函数,而不是相反 RAISE是通知客户某个职能部门内部状况的适当

我在Postgres中开发一个PL函数,在其中我根据一些逻辑修改表的记录,然后执行一个最终查询(基本上是计数),如果得到的数字是正数,我抛出一个异常以回滚事务(因为PostgreSQL的函数不显式支持事务)

那么,这是模拟事务的好方法吗?你有更好的建议吗


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块回滚已完成的工作或仅回滚异常???@FearUs
ERROR
或更大。谢谢,这比让整个函数抛出异常要好得多!但是,为了澄清,任何提升级别都会导致begin异常块回滚已完成的工作或仅回滚异常???@FearUs
ERROR
或更高。