您的位置:首页 > 编程语言 > Java开发

spring jdbc事务配置demo

2012-08-29 10:29 274 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: