在 Grails 下如何防止异常导致事务回滚?

2024-05-07

我的 Grails 服务遇到一个问题,即与事务无关的吞没异常会导致事务回滚,即使它与域对象的持久性无关。

在我的服务中,我有一些类似的东西

updateSomething(domainObj) {
    def oldFilename = domainObj.filename
    def newFilename = getNewFilename()

    domainObj.filename = newFilename
    domainObj.save(flush: true)

    try {
        cleanUpOldFile(oldFilename)
    } catch (cleanupException) {
        // oh well, log and swallow
    }
}

我看到的是,当我清理旧文件时出现异常时,我会记录它并吞下它,但它仍然会导致事务回滚,即使我已经完成了域对象的更新。

如何限制范围事务在清理之前完成,或者是否有其他方法可以使清理异常不会导致回滚?

仅供记录,我使用的是 Grails 2.1.1


您可以使用注释来进行更细粒度的事务划分。默认情况下,服务是事务性的,并且所有公共方法都是事务性的。但如果你使用任何@Transactional注释,Grails 并不使所有事情都成为事务性的——您拥有完全的控制权。

运行时异常会自动触发回滚,但检查异常则不会。尽管 Groovy 不要求您捕获已检查的异常,但该功能是 Spring 的功能,它不了解 Groovy 异常处理。

事务是通过将服务类实例包装在代理中来实现的。如果异常“逃逸”了代理,无论它是否被捕获,回滚都已经发生。

所以你有几个选择。注释updateSomething as @Transactional但不要注释cleanUpOldFile:

import org.springframework.transaction.annotation.Transactional

@Transactional
def updateSomething(domainObj) {
...
}

def cleanUpOldFile(...) {
   ...
}

您还可以使用一个或多个不应回滚事务的未经检查的异常(或在其他用例中应回滚的检查异常)来注释 cleanUpOldFile,例如

@Transactional(noRollbackFor=[FooException, BarException])
def cleanUpOldFile(...) {
   ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Grails 下如何防止异常导致事务回滚? 的相关文章

  • Grails/GGTS 2.4.2 没有将插件放在类路径上?

    我正在尝试将旧的 1 3 Grails 项目更新到最新的 Grails Groovy etc 所以我下载了 Grails 2 4 2 Groovy 2 3 和 Java 1 7 0 65 然后我通过 Import gt Grails 导入了
  • 如何在 Grails 2.4 中外部化 Maven 凭证

    我正在尝试在 Grails 2 4 项目中从使用 Ivy 迁移到使用 Aether 解析器 我遇到的问题与外部化凭证有关 与此相关的信息可以在 Grails 手册中找到 http grails org doc latest guide co
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • Grails:SpringSecurity 角色层次结构未按预期工作

    我正在 Grails 2 0 1 中使用 springsecurity 插件 我的角色层次结构和其他 s2 属性如下所示 grails plugins springsecurity userLookup userDomainClassNam
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • MySQL 行级锁

    我不确定行级锁是如何工作的 但这是我的问题 我有一个表 T id int balance int engine InnoDB 我想锁定 ID 1 的行 所以我开始一个像这样的事务 start transaction select from
  • Hibernate 实体管理器在查询之前自动刷新并在事务中提交对数据库的更改

    我在 Jboss AS 6 0 0 Final 上使用 Hibernate 3 6 0 和 JPA 2 在我的 EJB 中 有一个方法可以更新实体值并对其进行一些查询 整个方法在BMT事务中运行 如果出现任何问题 所有更改都应该回滚 而不是
  • 如何使用 JPA 和 Hibernate 修复 StaleObjectStateException

    控制器逻辑 def updateObject Object o Object get params id as Long o otherObjects clear objectDataService saveObject o id Othe
  • 如何在 Loopback 中实现 ACID 事务

    我们一直在尝试在 Loopback 中实现 ACID 事务 但没有成功 文档中唯一的示例使用 create 方法 我们尝试完全覆盖事件以及操作挂钩的多种变体 我们只能让创建示例正常工作 核心要求 我们需要能够在特定模型的create和upd
  • Febelfin CODA(编码账户报表)2.3 仅在比利时使用?

    我的任务是编写一些代码来解释来自 不同 比利时 银行的 CODA 文件 CODA 文件代表编码帐户文件文件 似乎是文本文件的比利时名称 其中包含特定银行帐户上发生的每笔银行交易的一行 这包括 SEPA 直接借记交易信息 我们合作的前 2 家
  • 在 Grails 控制台中导入服务?

    如何获取 grails 控制台中的服务 我的业务规则是在服务中实现的 但我无法在 grails 控制台中访问它们 有谁知道如何帮助我 春天ApplicationContext可用为ctx控制台中的变量 您可以使用它来访问 Spring be
  • 开始使用 Groovy/Grails? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对Java有了一些了解 我想学习Groovy grails 因此 请向我推荐任何好的网站和博客 我可以在其中找到文档以及 Groovy
  • 动画片段和返回堆栈

    我在使用或理解如何弹出时遇到问题 后台堆栈中的 FragmentTransactions 处理自定义 动画 具体来说 我希望它能够调用 out 动画 但是 看来不是 我有一个简单的方法来处理片段事务 FragmentTransaction
  • Grails:在域类中动态注入服务

    我需要注入基于域属性的服务 到目前为止我想出了以下内容 ApplicationHolder application getServiceClass package property Service clazz 但以这种方式加载它不会注入它的
  • grailsGrails 单元测试中的应用程序访问

    我正在尝试为使用 grailsApplication config 进行一些设置的服务编写单元测试 看来在我的单元测试中 服务实例无法访问其设置的配置文件 空指针 而当我运行 run app 时它可以访问该设置 我如何配置服务以在单元测试中
  • DTC 防火墙要求?

    我正在尝试建立一个环境 其中源自 Web 服务器 asp net 的 TransactionScope 将通过 WCF 将事务传输到应用程序服务器 然后再传输到数据库 由于我被迫使用 SQL Server 2005 数据库 这通常会导致事务
  • 直接链接到普惠制

    在一个普惠制中 是否可以创建到另一个普惠制的直接链接 我知道我可以使用
  • MS Access (Jet) 事务、工作区

    我在提交事务 使用 Access 2003 DAO 时遇到问题 它的表现就好像我从未调用过 BeginTrans 我在 CommitTrans 上收到错误 3034 您尝试在未先开始事务的情况下提交或回滚事务 并且更改将写入数据库 大概是因
  • SQL服务器事务

    我需要了解sql server事务 我浏览了谷歌上的一些文章 但我什么也没理解 谁能帮我 您可以通过写入显式启动事务BEGIN TRANSACTION 您可以通过运行来结束事务COMMIT TRANSACTION 之前COMMIT运行时 受
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn

随机推荐