首页 > 解决方案 > 在 Postgres 中回滚

问题描述

据我所知,我们不能在函数中使用启动事务,因此我们不能在函数中使用 COMMIT 和 ROLLBACK。

  1. 但是我们如何通过一些 if 条件回滚呢?
  2. 那么我们如何才能在特定级别的隔离中执行一系列语句呢?我的意思是当应用程序想要调用 SQL (plpgsql) 函数并且该函数确实需要在具有特定隔离级别的事务中运行时的情况。在这种情况下该怎么办?
  3. 在哪些情况下运行 ROLLBACK 真的很实用?仅当我们手动编写脚本时,检查某些内容,如果我们不喜欢结果,则手动回滚。在同样的情况下,我看到了保存点的实用性。但是,我觉得这是一个严重的限制。

标签: postgresql

解决方案


  1. 如果要回滚整个事务,RAISE则异常。

    如果您只想回滚部分工作,请BEGIN在要回滚的点处开始一个新块,并在该块中添加一个EXCEPTION子句。

  2. 由于事务是在函数外部启动的,所以当您在函数中时,必须正确设置隔离级别。

    您可以查询

    SELECT current_setting('transaction_isolation', TRUE);
    

    如果设置不正确,则抛出错误。

  3. 太笼统或太简单而无法回答。

    如果您在处理过程中达到了想要撤消迄今为止在事务中所做的所有事情的点,则您回滚事务。

    通常,这是通过抛出错误隐式而不是显式发生的。


推荐阅读