我正在 Postgres 中开发一个 PL 函数,我在其中根据某种逻辑修改表的记录,然后我执行最终查询(基本上是计数),如果我得到的数字是正数,我抛出回滚事务的异常(因为 PostgreSQL 的函数不明确支持事务)。
那么这是模拟交易的好方法吗?你有更好的建议吗?
PS:我正在使用 PostgreSQL 9.2,但我很快就会迁移到 9.3,如果这可能有所帮助的话。
最佳答案
如果您希望中止函数内的事务,那么是的,引发异常是一个不错的选择。
通过在函数中使用 BEGIN ... EXCEPTION
block ,您可以在 PL/PgSQL 函数中使用子事务。使用内部 BEGIN ... EXCEPTION
block ,并在其中 RAISE
使用用户定义的 SQLSTATE 异常。在 EXCEPTION
block 中捕获异常。
BEGIN ... EXCEPTION
block 中的 RAISE
(ERROR
或更高)将回滚该 block 中完成的工作,因为如果您使用了 SAVEPOINT
和 ROLLBACK TO SAVEPOINT
。
函数不能强制回滚顶级事务;如果您 RAISE
一个异常,外部 pl/pgsql 函数可以在 BEGIN ... EXCEPTION
block 中捕获异常,或者客户端可以使用 ROLLBACK TO保存点
。
关于sql - 在 PostgreSQL 中故意引发异常是一件好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740342/