我必须要同时更新需要更新的域类,我想使用事务以便允许对两者或两者都不进行更改。 例如 :

我有两个不同的域类(用户和关注)

User currentUser =..
User targetUser = ..
Follow followUser = ..

targetUser.follower = targetUser.follower + 1
currentUser.follow = currentUser.follow + 1
targetUser.save(flush:true)
currentUser.save(flush:true)
followUser.save(flush:true) 

我希望所有这些都一起发生,或者如果一个失败,则所有事情都不会发生并被回滚。 我怎样才能做到这一点? 我看到了DomainObject.withTransaction,但是我有两个不同的域,所以我应该嵌套吗?

===============>>#1 票数:3

正确的解决方案是将该事务代码移至服务中。 文档概述了如何从控制器创建和使用服务。 那是正确的解决方案。

但是,这不是唯一的方法。 如您所见,可以使用withTransaction在事务范围内运行代码。 例如(直接来自文档 ):

Account.withTransaction { status ->
    def source = Account.get(params.from)
    def dest = Account.get(params.to)

    int amount = params.amount.toInteger()
    if (source.active) {
        source.balance -= amount

        if (dest.active) {
            dest.amount += amount
        }
        else {
            status.setRollbackOnly()
        }
    }
}

withTransaction闭包内的代码可以跨越任意数量的Domain类。 您可以根据自己的喜好混合搭配。

再次强调。 正确的方法是使用服务

  ask by AlexCon translate from so

未解决问题?本站智能推荐:

1回复

Grails或Spring方法级事务

我是春季/春季交易的新手,阅读后仍然不清楚,所以我将其发布在这里, 我有一个注释为@Transactional的服务类,并且我有一些方法被注释为 其中一些不是。 假设我有来自类级别的事务t1和来自doSomething()-REQUIRES_NEW的t2事务。
1回复

Grails对于transaction = false的默认传播是什么?

将transactional设置为false会为服务中的每个方法禁用Spring管理的自动事务划分。 (C) 我是对的,它等效于显式的@Transactional(propagation = Propagation.SUPPORTS )吗? 还是不能通过@Transaction准
1回复

将声明性的Spring事务(Grails服务)传播到纯JDBC代码

我有一个Grails服务方法,该方法调用一个普通的Java类,以使用JDBC将一些数据保存到DB中。 接下来,grails服务方法也将写入同一数据库。 这应该全部发生在同一事务中。 myServiceMethod当前正在使用默认传播类型:PROPAGATION_REQUIRED(因为
1回复

Grails事务问题IllegalStateException密钥BasicDataSource TransactionSynchronizationManager.bindResource的已有值

在grails 2.1.0中使用服务时,出现以下异常。 关于调试的想法? 造成原因: 全栈
1回复

Grails集成测试和事务

我不明白为什么这个集成测试失败了。 我可以通过删除服务方法上方的@Transactional(propagation = Propagation.REQUIRES_NEW)注释,或者通过在Integration Test中设置transactional = false来通过测试。 我意识
2回复

服务于grails的多种方法

我在grails应用程序中创建了一项服务。 在该服务中,有25种方法。 一些方法用于获取数据并传递给控制器​​,一些方法用于应用业务逻辑,其他方法用于数据库数据CRUD操作。 编写具有不同行为的多个方法来服务是个好主意吗? 并且我必须使服务具有事务性吗? 以及默认方法的用途是什
2回复

Grails服务交易行为

在Grails应用程序中,服务方法的默认行为是它们是事务性的,如果抛出未经检查的异常,事务将自动回滚。 但是,在Groovy中,不会强制处理(或重新抛出)已检查的异常,因此存在一种风险,即如果服务方法抛出已检查的异常,则不会回滚该事务。 考虑到这一点,似乎建议注释每个Grails服务类
2回复

Grails withTransaction()和事务服务方法之间的区别

我正在使用带有多租户DB的Grails 3应用程序。 可以理解的是,出于连接池性能的原因,对多租户DB的任何查询都必须在事务中进行。 我没有链接,但是Graeme Rocher在SO的某个位置概述了该链接。 因此,当我执行以下操作时,它可以正常工作: 但是当我将其移至服务方法时
1回复

为什么启用@Cacheable会导致我的事务失败?

我有一个服务,我想使其可缓存。 我一直在研究grails-cache插件 ,它看起来非常有前途,但它引起了一些我不理解的行为。 考虑以下服务: 现在这是ContentService定义: 这一切都正常,直到我尝试添加缓存。 首先,我在Config.groovy中进行设置
1回复

控制器中出现Grails UnexpectedRollbackException

我的Grails服务调用了一个引发运行时异常的插件。 就我而言,我不在乎异常,因此它被吞没了。 一切正常,捕获到异常,然后继续处理。 但是,在我的控制器中,我有一个catch (Throwable t)块,由于吞咽了异常,我不希望执行该块。 事实证明执行catch (Throwab