Grails批量处理锁定在桌子上

问题描述 投票:6回答:1

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

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

grails gorm
1个回答
4
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.