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

标签 sql postgresql postgresql-9.2

我正在 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 中完成的工作,因为如果您使用了 SAVEPOINTROLLBACK TO SAVEPOINT

函数不能强制回滚顶级事务;如果您 RAISE 一个异常,外部 pl/pgsql 函数可以在 BEGIN ... EXCEPTION block 中捕获异常,或者客户端可以使用 ROLLBACK TO保存点

关于sql - 在 PostgreSQL 中故意引发异常是一件好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740342/

相关文章:

SQL:有什么方法可以在更新语句中使用 Order By 吗?

java - Hibernate:如何指定聚簇索引注释

sql - 从 postgres 数据库创建 JSON 文件

postgresql - 查询返回不同的行数,导致交叉表错误

ruby-on-rails - Rails 后台 worker 似乎被包裹在交易中

php - laravel Auth::login($user) 总是返回 401 Unauthorized

sql - 获取一行中的 MAX 和 MIN SQL

postgresql - 在postgresql中获取上周周一到上周周日的数据

postgresql - 如何在 postgresql 中强制删除索引关系?

postgresql - 使用 Liquibase 从 PostgreSQL 自定义转储文件还原