在JpaTransactionManager中setNestedTransactionAllowed的目的是什么

时间:2017-08-05 01:21:33

标签: spring hibernate jpa

我使用spring boot 1.5.2 RELEASE。

foreach (BD bData in bl.NameList)
{
    Object[] param = new Object[2];
    param[0] = bData.m_Width;
    param[1] = bData.m_Height;
    DataGrid1.Rows.Add(param);
}

那么 NestedTransactionAllowed 真的有用吗?     我创建这样的代码:

JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(ptvEntityManagerFactory);
    txManager.setDataSource(ds);
    txManager.setJpaDialect(hibernateDialect);
    //txManager.setNestedTransactionAllowed(true);

这是问题所在。无论 NestedTransactionAllowed 是true还是false,runTimeException总是在saveToRepository()和saveToJdbcTemplate()中回滚。它的默认值为false,并且有一大块JavaDoc来描述这个标志。

但我仍然不明白 NestedTransactionAllowed 的重点是什么? 你们可以用一些场景帮助我显示这个值在true和false之间的区别吗? 非常感谢

顺便说一句:实体经理是休眠的。

@Transactional
public void testNestTransaction() {
    saveToRepository()
    saveToJdbcTemplate();
    throw new RuntimeException();
}

@Transactional
private void saveToRepository() {
    employeeRepository.save(new MyEntity(xxx,xx,xx));
}

private void saveToJdbcTemplate() {
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
   // the code in this method executes in a transactional context
        protected void doInTransactionWithoutResult(TransactionStatus status) {
  String sql = "INSERT INTO task (id,create_by,description) VALUES 
   (?,?,?)";
          jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter().....  

        }
}

1 个答案:

答案 0 :(得分:1)

您的 setNestedTransactionAllowed 无效,因为JpaTransaactionManager无法使用嵌套事务支持。摘录自official doc -

  

此事务管理器通过JDBC 3.0支持嵌套事务   保存点。 “nestedTransactionAllowed”标志默认为false   但是,由于嵌套事务只适用于JDBC   连接,而不是JPA EntityManager及其缓存的实体对象   和相关的背景。如果需要,您可以手动将标志设置为true   使用嵌套事务来访问参与的JDBC访问代码   JPA事务(假设您的JDBC驱动程序支持Savepoints)。   请注意,JPA本身不支持嵌套事务!因此,做   不要指望JPA访问代码在语义上参与嵌套   事务。