我正在使用嵌入在Spring-MVC应用程序中的H2数据库。
我已在我的服务级别声明了交易。特别是我有一个案例,我们做以下几点:
但我意识到在DB事务中存在webservices调用会导致表范围的锁定,导致其他用户收到错误(我可以在具有2个浏览器的单用户系统上生成此错误)。
我正在努力策划我最好的行动方案。
我应该补充一点,我的服务方法serviceA()
会调用另外两种方法webServiceX()
和daoMethodY()
。 serviceA()
包含在事务中,因为任何异常都需要回滚webServiceX()
(我提供的函数),并回滚daoMethodY()
数据库操作(DataSourceTransactionManager
的函数)。
答案 0 :(得分:2)
我认为你的方法是合理的,如果可能的话,你一定要尝试行级锁定。
您可能想重新考虑您的设计。数据库是否真的来自Web服务的重复状态?在这种情况下,您可能需要考虑缓存Web服务调用。但这取决于您的申请。
或者,您可能只需要滚动自己的事务管理。只要它是通用的,它应该不会太麻烦。我们在我们的项目中完成了这项工作,我们没有使用Spring的交易。像
这样的东西performTransaction() {
doWSCall();
// no need to worry about WS call exception, because DB call won't happen
try {
doDbCall()
} catch (Exception ex) {
rollbackWSCall()
// rethrow ex
}
}
其中所有方法都是抽象的。
答案 1 :(得分:0)
我不会将Web服务调用混合到数据库调用中。你的方法违反了“做好一件事”的规则。
让您的服务调用其他Web服务和DAO。