[英]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服务调用。
您可以用不同的方式完成全部工作:
通过在数据库中使用MVCC模式,我可以避免完全锁定更新。 完成此操作后,我可以执行相同的测试而没有任何锁争用。
MVCC模式允许在未提交的更新仍在进行时进行读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.