Grails批量处理锁定在桌子上

Rax*_*Rax 6 grails grails-orm

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

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

Pet*_*ter 4

flush=true将数据从本地休眠会话写入数据库,因此对于避免像您这样的大批量操作在应用程序服务器上出现内存问题非常重要,但它不会影响数据库锁定行的方式。

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

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

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