查询Nested Transaction细节时,经典例子 serviceA 调用
serviceB,当SeviceB事务传播属性为NESTED时,serviceA
只要catch住了Exception就能保证调用serviceB之前的操作提交而不受ServiceB异常的影响,但是如果
REQUIRES_NEW时,serviceA和serviceB相对独立,serviceB有异常会不影响serviceA.下面测试。
我用的是(maven dependencies里主要版本号)spring3.11 + jpa2.0 +
hibernate4.13.后来运行的时候发现有异常:
JpaDialect does not support savepoints - check your JPA provider's
capabilities
Java代码
private SavepointManager getSavepointManager() {
if (!isSavepointAllowed()) {
throw new NestedTransactionNotSupportedException(
"Transaction manager does not allow nested transactions");
}
SavepointManager savepointManager = getEntityManagerHolder().getSavepointManager();
if (savepointManager == null) {
throw new NestedTransactionNotSupportedException(
"JpaDialect does not support savepoints - check your JPA provider's capabilities");
}
return savepointManager;
}
jpa
transaction manager 不支持 nested
transaction,但JpaTransactionManager的属性nestedTransactionAllowed默认为true,如下。
Java代码
public JpaTransactionManager() {
setNestedTransactionAllowed(true);
}
后来才知道Hibernate也不支持Nested
Transaction,测试不了,只能用jdbc事务了,使用JdbcTemplate。
换成jdbc后的主要配置:
Xml代码
<context:component-scan base-package="cn.xx.xx" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:annotation-driven transaction-manager="tran