关于Spring事务回滚的问题

在Spring的配置文件中,若是数据源的defaultAutoCommit设置为True了,那么方法中若是本身捕获了异常,事务是不会回滚的,若是没有本身捕获异常则事务会回滚,以下例 好比配置文件里有这么条记录: <bean id="dataSource" class="xxx">
<property name="xxx" value="xxx"/>
<property name="xxx" value="xxx"/>
....
<property name="defaultAutoCommit" value="true" />
</bean>java

那么如今有两个状况 状况1:若是没有在程序中手动捕获异常 [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() throws Exception {
doDbStuff1();
doDbStuff2();//假如这个操做数据库的方法会抛出异常,如今方法doDbStuff1()对数据库的操做 会回滚。
}数据库

状况2:若是在程序中本身捕获了异常 [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() {
try {
doDbStuff1();
doDbStuff2();//假如这个操做数据库的方法会抛出异常,如今方法doDbStuff1()对数据库的操做 不会回滚。
} catch (Exception e) {
e.printStackTrace();
}
}事务

如今若是咱们须要手动捕获异常,而且也但愿抛异常的时候能回滚肿么办呢? 下面这样写就行了,手动回滚事务: [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() {
try {
doDbStuff1();
doDbStuff2();
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上以后,若是doDbStuff2()抛了异常, //doDbStuff1()是会回滚的
}
}it

相关文章
相关标签/搜索