繁体   English   中英

春季:处理带有事务性数据库方法的长期Web服务调用的最佳方法?

[英]Spring: Best way to handle long-running web-service calls with transactional DB methods?

我们有一种服务方法,可以大致执行以下操作:

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

问题在于,一旦发生更新 ,数据库就会在事务持续时间内将保持在锁上 (每个Web服务平均调用5秒)。 当然,Web服务调用或DAO调用中的任何异常都应引起完全回滚。

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

如果Web服务调用不取决于您在上一次迭代中可能进行的更新,则可以在第一次通过时进行所有Web服务调用,并将结果收集在内存中,然后为所有更新启动事务。 这将使您的事务变得更短,并且由于我假设Web服务调用无论如何都不是事务性的,因此不会影响您数据的一致性。

因为我假设Web服务调用绝不是事务性的,所以可以在开始事务存储任何东西之前进行所有Web服务调用。

您可以用不同的方式完成全部工作:

  • 顺序-2个循环,一个事务和一点内存:通过所有Web服务调用的循环将结果存储在数组中,打开事务,然后循环通过所有结果并将其存储
  • 顺序-一个循环,和n个事务:在循环中,首先为一个项目调用Web服务,然后开始一个新的事务并存储它(循环结束)
  • 并行-并行进行Web服务调用-您可以将其与上述两种方式结合使用, 例如JB Nizet建议他的回答

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM