Grails 批量处理锁定 table

Grails bulk processing having lock on the table

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

我试过使用 flush:true,但没有用。

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

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

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

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