【问题标题】:Grails GORM locks table when updating a DB tableGrails GORM 在更新数据库表时锁定表
【发布时间】:2017-05-22 19:49:25
【问题描述】:

我正在迭代一个大型数据集并更新每一行。 数据锁定,只要它的循环和更改在完成之前不会保存

我的代码:

在控制器中

stocks.each { stock ->

        def s = stockService.updateData(stock)
        stockService.save s
    }

并且服务中的保存方法是唯一使用@Transactional的:

@Transactional
private void save(Stock stock) {
    stock.save(failOnError: true, flush: true)
}

【问题讨论】:

    标签: hibernate grails grails-orm transactional


    【解决方案1】:

    如果您不希望数据集一直被锁定,您可以为每次保存创建一个事务:

    private void save(Stock stock) {
        Stock.withNewTransaction {
            stock.attach()
            stock.save()
        }
    }
    

    缺点是,发生错误时无法回滚所有更改的数据集。

    【讨论】:

    • 循环运行时。我得到: 原因:org.springframework.orm.hibernate5.HibernateSystemException:非法尝试将集合与两个打开的会话相关联。收藏:[xxx.Stock.estimations#718];嵌套异常是 org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联。
    • 好的,Stock 似乎与“估计”有“对多”关系,并且估计与其他会话绑定。您可以将所有估计附加到新交易中。或者你可以调用“merge()”而不是“save()”。也许它会有所帮助。
    猜你喜欢
    • 2014-12-12
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多