【发布时间】:2012-12-09 10:59:16
【问题描述】:
我写了下面的代码来做下面的活动 我使用 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());
我观察到这两行都已提交给 DB ! 输出是
trxstsOuter.isCompleted()true
trxstsInner.isCompleted()false
trxstsInner.isCompleted()true
这是正确的行为吗? 在允许外部事务提交之前,不应该首先提交/回滚内部事务吗? 如果外部事务被提交,内部事务的回滚是否应该抛出错误?
【问题讨论】:
-
事务管理器(本地事务/容器管理/托管事务/自定义事务管理器、事务传播、逻辑事务/物理事务、内部事务、数据库限制(嵌套事务是不是每个 rdbms 都支持)等等,所以我什至敢于发布任何答案 :-) 这需要多年的学习,我不认为试错法是开始的方式:-)
-
事务和javadoc说的一样
-
@BorisTreukhov 从调试中可以看出它们是不同的对象,从 isCompleted() 的 Sysouts 中也可以看出它们是单独处理的
-
@BorisTreukhov 你说“每个 rdbms 都不支持嵌套事务”......我正在使用 HSQL DB。会不会有问题?
-
在大多数应用程序中,您只使用单个事务,嵌套数据库事务是非常高级的东西,很少使用 - 您应该尽可能使用 java 实体对象作为状态。
标签: spring transactions nested