【发布时间】:2017-12-18 23:25:49
【问题描述】:
我有一个与 SQL Server 对话的 Grails 服务,该服务对 80,000 多条记录进行批量处理(从数据库更新记录或创建新记录)。在进行此过程时,这些记录将被此过程锁定。如果其他人试图单独更新一条记录,它就会超时,等待该记录。批量处理时如何查询和更新记录?这样就不会被屏蔽了?
我尝试过使用flush:true,但没有帮助。
【问题讨论】:
标签: grails grails-orm
我有一个与 SQL Server 对话的 Grails 服务,该服务对 80,000 多条记录进行批量处理(从数据库更新记录或创建新记录)。在进行此过程时,这些记录将被此过程锁定。如果其他人试图单独更新一条记录,它就会超时,等待该记录。批量处理时如何查询和更新记录?这样就不会被屏蔽了?
我尝试过使用flush:true,但没有帮助。
【问题讨论】:
标签: grails grails-orm
flush=true 将本地休眠会话中的数据写入数据库,因此对于像您这样的大型批量操作避免应用程序服务器上的内存问题很重要,但它不会影响数据库锁定行的方式。
您需要改变的是您的交易边界。您的行都是锁定的,因为它们在同一个事务中,这可能是不希望的(或对数据库有效)。除非有需要锁定所有这些行的原因,否则您可以使您的服务无状态。然后每一行将在其自己的事务中更新并仅短暂锁定。但是,这可能会慢很多。
对于中间立场,我推荐一种混合方法,您将服务设置为 static transactional=false,然后使用 .withTransaction {...} 闭包和内部循环来一次执行一定数量的行。
这是一篇旧文章,但您应该阅读一些有用的信息,其中提供了我所提到的代码示例。 http://sacharya.com/transactions-in-grails/
【讨论】: