我使用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().....
}
}
答案 0 :(得分:1)
您的 setNestedTransactionAllowed 无效,因为JpaTransaactionManager无法使用嵌套事务支持。摘录自official doc -
此事务管理器通过JDBC 3.0支持嵌套事务 保存点。 “nestedTransactionAllowed”标志默认为false 但是,由于嵌套事务只适用于JDBC 连接,而不是JPA EntityManager及其缓存的实体对象 和相关的背景。如果需要,您可以手动将标志设置为true 使用嵌套事务来访问参与的JDBC访问代码 JPA事务(假设您的JDBC驱动程序支持Savepoints)。 请注意,JPA本身不支持嵌套事务!因此,做 不要指望JPA访问代码在语义上参与嵌套 事务。