Spring:使用事务DB方法处理长时间运行的Web服务调用的最佳方法?

时间:2011-04-21 08:19:54

标签: java database spring transactions

我们有一种服务方法,大致可以做到以下几点:

@Transactional
public void serviceMethod(...){
   for(Item i : bunchOfItems){
      webServices.webServiceCall(...);
      dao.daoUpdateMethod(...);
   }
}

问题是,只要发生更新,数据库就会在交易的持续时间内对表进行锁定( webservice呼叫平均每个5秒)。当然,Web服务调用或DAO调用中的任何异常都应该导致完全回滚。

解决这种情况的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

如果Web服务调用不依赖于您在上一次迭代中可能已更新的内容,则可以在第一次传递中进行所有Web服务调用并将结果收集到内存中,然后为所有内容启动事务更新。这会使您的交易更短,因为我认为Web服务调用无论如何都不是事务性的,它不会影响数据的一致性。

答案 1 :(得分:2)

因为我假设webservice调用不以任何方式进行事务处理,所以在开始事务存储之前,可以执行所有webservice调用。

你可以用不同的方式完成所有事情:

  • 顺序 - 2个循环,一个事务和一个位内存:循环通过所有webservice调用将结果存储在一个数组中,打开事务然后循环通过所有结果并存储它们
  • 顺序 - 一个循环和n个事务:在循环中,首先为一个项目调用Web服务,然后启动一个新事务并存储它(循环结束)
  • 并行 - 并行执行Web服务调用 - 您可以将其与上述两种方式结合起来like JB Nizet suggested his answer

答案 2 :(得分:0)

通过在数据库中使用MVCC模式,我可以避免完全锁定更新。执行此操作后,我可以执行相同的测试而不会发生任何锁定争用。

MVCC模式允许在未提交的更新仍在进行时进行读取。