Spring 事务内编程事务

Kau*_*ele 1 spring transactions nested

我编写了下面的代码来执行以下活动,我使用 Spring 类创建了一个事务。插入一行。创建了其他交易。插入另一行。已提交的外部事务。回滚内部事务。

TransactionStatus trxstsOuter= dsTrxMngr.getTransaction(null);
    jdbcTemplate.update("insert into kau_emp values(6,'xyz' )");
    TransactionStatus trxstsInner= dsTrxMngr.getTransaction(null);
        jdbcTemplate.update("insert into kau_emp values(7,'pqr' )");

dsTrxMngr.commit(trxstsOuter);
System.out.println("trxstsOuter.isCompleted()" + trxstsOuter.isCompleted());
System.out.println("trxstsInner.isCompleted()" + trxstsInner.isCompleted());
dsTrxMngr.rollback(trxstsInner);
    System.out.println("trxstsInner.isCompleted()" + trxstsInner.isCompleted());
Run Code Online (Sandbox Code Playgroud)

我观察到这两行都已提交给数据库!输出是

trxstsOuter.isCompleted()true
trxstsInner.isCompleted()false
trxstsInner.isCompleted()true
Run Code Online (Sandbox Code Playgroud)

这是正确的行为吗?在允许外部事务提交之前,不应该首先提交/回滚内部事务吗?如果外部事务已提交,内部事务的回滚是否会引发错误?

Bor*_*hov 5

在您的示例中,事务Propagation.REQUIRED用作默认值,所有逻辑事务都映射到单个物理事务

当传播设置为 PROPAGATION_REQUIRED 时,将为应用该设置的每个方法创建一个逻辑事务范围。每个这样的逻辑事务范围可以单独确定仅回滚状态,其中外部事务范围在逻辑上独立于内部事务范围。当然,在标准 PROPAGATION_REQUIRED 行为的情况下,所有这些范围都将映射到同一物理事务。因此,在内部事务范围中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您所期望的那样)。

因此,在您的示例中,两个逻辑事务映射到一个物理事务。

查看文档