【发布时间】:2017-10-12 09:29:27
【问题描述】:
我正在开发 Spring + Hibernate 应用程序。我们已经为服务类方法应用了事务。我的问题
hibernate 是否可以使用单个连接/会话或使用多个连接来执行服务方法的所有 db 语句?如果它使用多个连接,是否可以在任何运行时异常的情况下回滚多个连接上的 db 语句?
假设如果服务方法的业务逻辑执行时间超过 removeAbandonedTimeout 值,那么在放弃连接时如何提交/回滚?
如果我在哪里错了,请纠正我。提前致谢。
更新:-
如果查询花费的时间比 removeAbandonedTimeout 长,它会抛出异常。假设我的服务方法有两个数据库调用,在这两个调用之间有一些业务逻辑(没有数据库调用)。在执行第一个查询之前,它会创建数据库连接,假设第一个数据库调用需要 1 秒,然后业务逻辑执行需要 60 秒。如果此时放弃连接(如果我们将 removeAbandonedTimeout 设置为 60 秒),要执行第二个数据库查询,它会创建另一个连接,对吗?如果第二个查询执行失败,它必须回滚第一个查询,因为它们都共享相同的事务。放弃连接怎么会发生这种情况?
【问题讨论】:
-
当事务超时或异常发生时,Hibernate 会回滚整个事务,不管连接数多少。
-
@Transactional on 方法将打开一个会话,即一个连接。提交/回滚将在方法退出时完成。默认适用于每个 runtimeException -> 回滚
-
@Zeromus 好的。但是如果连接在执行过程中被放弃怎么办?
-
假设它会抛出一个 jdbc4.CommunicationsException 并从那里回滚事务
-
我的问题更新了,请检查。
标签: java database hibernate jdbc