【问题标题】:Using Grails Transaction when saving two different domain object in one shot在一次保存两个不同的域对象时使用 Grails Transaction
【发布时间】:2014-06-04 08:25:51
【问题描述】:

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

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

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) 

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

【问题讨论】:

    标签: grails spring-transactions


    【解决方案1】:

    正确的解决方案是将此事务代码移动到服务中。 documentation 概述了如何从控制器创建和使用服务。这是正确的解决方案。

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

    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 闭包中的代码可以跨越任意数量的域类。你可以随意混搭。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2013-10-28
      • 2015-01-06
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多