同一JDBC事务中的Webservice调用导致数据库锁定超时

时间:2011-04-20 09:39:14

标签: java database spring-mvc h2

我正在使用嵌入在Spring-MVC应用程序中的H2数据库。

我已在我的服务级别声明了交易。特别是我有一个案例,我们做以下几点:

  1. 开始交易
  2. 进行网络服务电话
  3. 进行后续数据库调用
  4. 在回滚(异常)时,手动回滚webservices调用,并且Spring Transaction Manager处理在数据库事务上调用回滚。
  5. 但我意识到在DB事务中存在webservices调用会导致表范围的锁定,导致其他用户收到错误(我可以在具有2个浏览器的单用户系统上生成此错误)。

    我正在努力策划我最好的行动方案。

    • 我应该在Spring中更改事务隔离级别,是否会影响数据库锁定?
    • 在同一个交易中进行网络服务和数据库调用是不是很糟糕?
    • 我应该在H2 DB中启用行级别锁定吗?
    • 我没有考虑其他解决方案吗?

    我应该补充一点,我的服务方法serviceA()会调用另外两种方法webServiceX()daoMethodY()serviceA()包含在事务中,因为任何异常都需要回滚webServiceX()(我提供的函数),并回滚daoMethodY()数据库操作(DataSourceTransactionManager的函数)。

2 个答案:

答案 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。