桌子上有锁定的批量处理



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

我尝试使用flush:是的,但没有帮助。

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

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

对于中间立场,我建议您将服务设置为static transactional=false,但随后使用.withTransaction {...}闭合和一个循环一次进行一定数量的行。

这是一篇古老的文章,但您应该阅读有用的信息,以提供有关我提到的内容的代码示例。http://sacharya.com/transactions-ingrails/

相关内容

  • 没有找到相关文章

最新更新