我们有一种服务方法,大致可以做到以下几点:
@Transactional
public void serviceMethod(...){
for(Item i : bunchOfItems){
webServices.webServiceCall(...);
dao.daoUpdateMethod(...);
}
}
问题是,只要发生更新,数据库就会在交易的持续时间内对表进行锁定( webservice呼叫平均每个5秒)。当然,Web服务调用或DAO调用中的任何异常都应该导致完全回滚。
解决这种情况的最佳方法是什么?
答案 0 :(得分:3)
如果Web服务调用不依赖于您在上一次迭代中可能已更新的内容,则可以在第一次传递中进行所有Web服务调用并将结果收集到内存中,然后为所有内容启动事务更新。这会使您的交易更短,因为我认为Web服务调用无论如何都不是事务性的,它不会影响数据的一致性。
答案 1 :(得分:2)
因为我假设webservice调用不以任何方式进行事务处理,所以在开始事务存储之前,可以执行所有webservice调用。
你可以用不同的方式完成所有事情:
答案 2 :(得分:0)
通过在数据库中使用MVCC模式,我可以避免完全锁定更新。执行此操作后,我可以执行相同的测试而不会发生任何锁定争用。
MVCC模式允许在未提交的更新仍在进行时进行读取。