Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:使用事务性DB方法处理长时间运行的web服务调用的最佳方法?_Java_Database_Spring_Transactions - Fatal编程技术网

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模式,我可以完全避免锁定更新。完成此操作后,我可以在没有任何锁争用的情况下执行相同的测试


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

为什么更新会锁定整个表?在任何像样的DBMS中,它只会锁定更新过的行。这个问题与Spring无关,它是一个一般性的问题。