Java Spring:使用事务性DB方法处理长时间运行的web服务调用的最佳方法?
我们有一种服务方法,其大致功能如下:Java Spring:使用事务性DB方法处理长时间运行的web服务调用的最佳方法?,java,database,spring,transactions,Java,Database,Spring,Transactions,我们有一种服务方法,其大致功能如下: @Transactional public void serviceMethod(...){ for(Item i : bunchOfItems){ webServices.webServiceCall(...); dao.daoUpdateMethod(...); } } 问题是,只要更新发生,数据库就会在事务期间在表上保持一个锁(webservice平均每次调用5秒)。当然,webservice调用或DAO调用中的任
@Transactional
public void serviceMethod(...){
for(Item i : bunchOfItems){
webServices.webServiceCall(...);
dao.daoUpdateMethod(...);
}
}
问题是,只要更新发生,数据库就会在事务期间在表上保持一个锁(webservice平均每次调用5秒)。当然,webservice调用或DAO调用中的任何异常都应该导致完全回滚
解决这种情况的最佳方法是什么?如果web服务调用不依赖于您在上一次迭代中可能更新的内容,那么您可以在第一次过程中进行所有web服务调用,并在内存中收集结果,然后为所有更新启动事务。这将使您的事务更短,而且由于我假设web服务调用无论如何都不是事务性的,因此不会影响数据的一致性。因为我假设web服务调用在任何方面都不是事务性的,所以您可以在启动事务之前执行所有web服务调用以存储某些内容 你可以用不同的方式完成整个工作:
- 顺序-2个循环、一个事务和一个位内存:通过所有webservice调用循环将结果存储在一个数组中,打开事务,然后通过所有结果循环并存储它们
- 顺序-一个循环和n个事务:在循环中,首先为一个项目调用web服务,然后启动一个新事务并存储它(循环结束)
- 并行-并行执行web服务调用-您可以将其与上述两种方法结合使用
MVCC模式允许在未提交的更新仍在进行时进行读取。为什么更新会锁定整个表?在任何像样的DBMS中,它只会锁定更新过的行。这个问题与Spring无关,它是一个一般性的问题。