1. 前几天自己搞spring的dbcp配置事务,配置了事务,service层调用dao层的两个方法,其中第二个方法时出现异常,但第一个不回滚。但是logger4j日志也提示错误回滚了
最终定位是配置dbcp时有一个属性defaultAutoCommit属性没有配置,而此属性的默认值是true,所以导致没一步dao操作都会提交,所以不会回滚。
现将spring的部分配置文件贴出
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@172.16.147.148:1521:orcl</value>
</property>
<property name="username">
<value>aaaaaa</value>
</property>
<property name="password">
<value>aaaaa</value>
</property>
<property name="defaultAutoCommit">
<value>false</value>
</property>
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="set*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="load*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<tx:method name="save*" rollback-for="Exception"/>
<tx:method name="update*" rollback-for="Exception"/>
<tx:method name="delete*" rollback-for="Exception"/>
<tx:method name="merage*" rollback-for="Exception"/>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* com.test.service.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="serviceOperation"/>
</aop:config>
其中
<property name="defaultAutoCommit">
<value>false</value>
</property>
是必须要配置的,因为org.apache.commons.dbcp.BasicDataSource类的defaultAutoCommit属性默认值是true。通过源码可以看到
public class BasicDataSource
implements DataSource
{
public BasicDataSource()
{
defaultAutoCommit = true;
defaultReadOnly = null;
defaultTransactionIsolation = -1;
defaultCatalog = null;
driverClassName = null;
driverClassLoader = null;
maxActive = 8;
maxIdle = 8;
minIdle = 0;
initialSize = 0;
maxWait = -1L;
poolPreparedStatements = false;
maxOpenPreparedStatements = -1;
testOnBorrow = true;
testOnReturn = false;
timeBetweenEvictionRunsMillis = -1L;
numTestsPerEvictionRun = 3;
minEvictableIdleTimeMillis = 1800000L;
testWhileIdle = false;
password = null;
url = null;
username = null;
validationQuery = null;
validationQueryTimeout = -1;
accessToUnderlyingConnectionAllowed = false;
restartNeeded = false;
connectionPool = null;
connectionProperties = new Properties();
dataSource = null;
logWriter = new PrintWriter(System.out);
}