Spring:处理长时间运行的Web服务调用和事务性DB方法的最佳方法是什么?

3
我们有一个服务方法,大致执行以下操作:
@Transactional
public void serviceMethod(...){
   for(Item i : bunchOfItems){
      webServices.webServiceCall(...);
      dao.daoUpdateMethod(...);
   }
}

问题在于一旦发生更新,数据库就会在事务期间对表进行锁定(每个web服务调用平均需要5秒钟)。任何web服务调用或DAO调用中的异常都应该导致完全回滚。针对这种情况,最好的方法是什么?

1
为什么更新会锁定整个表?在任何体面的数据库管理系统中,它只会锁定被更新的行。 - user330315
1
这个问题与Spring无关,它是一个普遍性的问题。 - Ralph
3个回答

3
如果Web服务调用不依赖于您在先前迭代中可能更新的内容,您可以在第一次通过中进行所有Web服务调用并收集内存中的结果,然后为所有更新启动事务。这将使您的事务时间更短,并且由于我假设Web服务调用本身不是事务性的,因此不会影响数据的一致性。

2
因为我假设webservice调用在任何情况下都不是事务性的,所以您可以在开始事务存储之前进行所有webservice调用。
您可以以不同的方式完成整个过程:
  • 顺序 - 2个循环,一个事务和一些内存:循环遍历所有webservice调用,将结果存储在数组中,打开事务,然后循环遍历所有结果并将其存储
  • 顺序 - 一个循环和n个事务:在循环中,首先为一个项目调用web服务,然后启动新的事务并存储它(循环结束)
  • 并行 - 并行执行web服务调用 - 您可以将其与上述两种方法(例如JB Nizet在其答案中建议的方法)相结合

0
通过在数据库中使用MVCC模式,我可以完全避免更新时的锁定。这样做后,我可以执行相同的测试而不会有任何锁竞争。
在MVCC模式下,读取可以在未提交的更新仍在进行中时发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接