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

Fea*_*rUs 1 sql postgresql postgresql-9.2

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

那么这是模拟交易的好方法吗?你有更好的建议吗?

PS:我正在使用 PostgreSQL 9.2,但我很快就会迁移到 9.3,如果这可能有帮助的话。

Cra*_*ger 5

如果您希望在函数内中止事务,那么是的,引发异常是一个不错的选择。

您可以通过在函数中使用BEGIN ... EXCEPTION块来在PL/PgSQL 函数中使用子事务。使用内部BEGIN ... EXCEPTION块并在其中RAISE使用用户定义的 SQLSTATE 异常。捕获EXCEPTION块中的异常。

块中的RAISE(ofERROR或更高)BEGIN ... EXCEPTION将回滚该块内完成的工作,就像您使用了SAVEPOINTand 一样ROLLBACK TO SAVEPOINT

函数不能强制回滚顶级事务;如果RAISE出现异常,外部 pl/pgsql 函数可以在BEGIN ... EXCEPTION块中捕获异常,或者客户端可以使用ROLLBACK TO SAVEPOINT.

  • @FearUs `ERROR` 或更大。 (2认同)