Spring:使用事务数据库方法处理长时间运行的 Web 服务调用的最佳方法?
我们有一个服务方法,它大约执行以下操作:
@Transactional
public void serviceMethod(...){
for(Item i : bunchOfItems){
webServices.webServiceCall(...);
dao.daoUpdateMethod(...);
}
}
问题是,一旦发生更新,数据库就会在表上锁定持续时间< strong>事务(Web 服务调用平均每次 5 秒)。当然,Web 服务调用或 DAO 调用中的任何异常都应该导致完全回滚。
解决这种情况的最佳方法是什么?
We have a service method which does approximately the following:
@Transactional
public void serviceMethod(...){
for(Item i : bunchOfItems){
webServices.webServiceCall(...);
dao.daoUpdateMethod(...);
}
}
The problem is that as soon as an update occurs the DB is holding a lock on the table for the duration of the Transaction (webservice calls average 5 sec each). Any exception in a webservice call or DAO call should, of course, cause a full rollback.
What's the best approach to this situation?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果 Web 服务调用不依赖于您在先前迭代中可能更新的内容,则您可以在第一遍中进行所有 Web 服务调用并将结果收集到内存中,然后启动所有更新的事务。这将使您的事务变得更短,并且由于我假设 Web 服务调用无论如何都不是事务性的,因此它不会影响数据的一致性。
If the web service call doesn't depend on what you might have updated in a previous iteration, you could make all your web service calls in a first pass and collect the results in memory, and then start a transaction for all your updates. This would make your transaction much shorter and, since I assume the web service call isn't transactional anyway, it wouldn't affect the coherence of your data.
因为我假设 Web 服务调用不是以任何方式进行事务的,所以您可以在启动事务来存储某些内容之前执行所有 Web 服务调用。
您可以用不同的方式完成整个工作:
Because I assume the webservice call is not transactional in any way, you can do all webservice calls before you start the transaction to store something.
You can do the whole stuff in different ways:
通过在数据库中使用 MVCC 模式,我可以完全避免锁定更新。完成此操作后,我可以执行相同的测试,而不会出现任何锁争用。
MVCC 模式允许在未提交的更新仍在进行时进行读取。
By employing MVCC mode in the database I can avoid locking on updates altogether. After doing this I can perform the same test without any lock contention.
MVCC mode allows reads to occur while an uncommitted update is still in progress.