Grails批量处理锁定在桌子上

时间:2017-12-18 23:25:50

标签: grails gorm

我有一个Grails服务,它与SQL Server进行通信,后者执行超过80,000条记录的批量处理(更新数据库记录或创建新记录)。在此过程中,这些过程正在锁定这些记录。如果其他人试图单独更新记录,则超时,等待该记录。如何在批量处理期间查询和更新记录?这样它不会被阻止?。

我尝试过使用flush:true,但它没有帮助。

1 个答案:

答案 0 :(得分:4)

flush=true将来自本地hibernate会话的数据写入数据库,因此避免应用程序服务器上的内存问题对于像您这样的大型批量操作很重要,但这不会影响数据库锁定行的方式。

您需要更改的是您的交易边界。您的行都是锁定的,因为它们位于同一个事务中,并且可能不需要(或者对数据库有效)。除非有必要锁定所有这些行的原因,否则您可以使您的服务无状态。然后每行将在其自己的事务中更新并仅短暂锁定。然而,这可能会慢得多。

对于中间立场,我建议采用混合方法,将服务设置为static transactional=false,然后使用.withTransaction {...}闭包和一个循环来一次执行一定数量的行

这是一篇旧文章,但您应该阅读有用的信息,并提供有关我所提及的代码示例。 http://sacharya.com/transactions-in-grails/