【问题标题】:grails: queue the update operation if an update is already being performedgrails:如果已执行更新,则将更新操作排队
【发布时间】:2013-11-07 19:49:08
【问题描述】:

如果已经对对象执行更新,我可以将更新操作排队,以避免数据库过时状态异常。有没有办法在 grails 中做到这一点?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    是的,通过使用显式锁定。默认情况下使用乐观锁定,这适用于许多您不期望并发编辑或您认为它们不太可能发生的情况。但是,如果您确实希望同时进行编辑,那么您应该让数据库为您完成工作。

    在您的控制器或其他代码中,而不是做类似的事情

    def thing = Thing.get(params.id)
    thing.properties = params
    thing.save()
    

    将代码移至事务服务方法。服务默认是事务性的,所以不需要配置。在这里使用 lock 方法,因为它必须在事务中完成,并且无论如何数据库更新都应该在事务中完成:

    class ThingService {
    
       void updateThing(params) {
          def thing = Thing.lock(params.id)
          thing.properties = params
          thing.save()
       }
    }
    

    我的偏好不是简单地传递 params 映射,而是使用单个名称属性,但这与此问题无关。

    【讨论】:

    • 感谢您的回答。再问一个问题,保存后锁是否自动释放
    • 事务结束时发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多