3

我想将以下堆栈跟踪作为 java 调用:

B.method2 (annotated with a plain @Transactional)
A.method1 (annotated with a plain @Transactional)
Main.main (starting point of the call, with no current transaction)

我希望在输入 A.method1 时启动事务 - 当离开 A.method1 时事务将被提交(或回滚)。我还希望在 B.method2 中使用相同的事务。

从 B.method2 中引发 RuntimeException。这是默认情况下为 rollbackFor “列出”的异常。异常在 A.method1 中被捕获,但在离开 B.method2 时会越过@Transactional 的边界。

这是我的问题:(当前)事务是否会被标记为回滚?

4

1 回答 1

1

默认传播模式是REQUIRED,method2 将使用为 method1 启动的事务。在异常情况下,该事务将被标记为回滚,因此不会向数据库提交任何内容。你可能会得到UnexpectedRollbackException方法1。

这不是期望的行为,因为启动事务(拥有它)的代码应该控制回滚/提交。我会重新组织您的代码以避免这种可能性。

于 2012-02-10T11:05:47.850 回答