博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Spring事务回滚的问题
阅读量:7182 次
发布时间:2019-06-29

本文共 1159 字,大约阅读时间需要 3 分钟。

hot3.png

在Spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例 比如配置文件里有这么条记录: <bean id="dataSource" class="xxx">

<property name="xxx" value="xxx"/>
<property name="xxx" value="xxx"/>
....
<property name="defaultAutoCommit" value="true" />
</bean>

那么现在有两个情况 情况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()是会回滚的
}
}

转载于:https://my.oschina.net/u/2543341/blog/719351

你可能感兴趣的文章
蓝桥杯 大臣的旅费
查看>>
hql中不能写count(1)能够写count(a.id)
查看>>
Atitit。Time base gc 垃圾 资源 收集的原理与设计
查看>>
还是态度问题
查看>>
判断记录是否存在的通用方法
查看>>
sift算法c语言实现
查看>>
报表中的Excel操作之Aspose.Cells(Excel模板)
查看>>
(二)STM32中中断优先级理解
查看>>
gulp教程之gulp-imagemin
查看>>
C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
查看>>
【C语言入门教程】3.3 条件控制语句
查看>>
CLGeocoder Error Domain=kCLErrorDomain Code=2
查看>>
Spring中的@scope注解
查看>>
M2M
查看>>
Spring MVC的web.xml配置详解(转)
查看>>
iptables禁止外网访问redis server服务默认端口6379的命令
查看>>
硅谷新闻9--图片三级缓存
查看>>
洛谷P1220关路灯[区间DP 提前计算代价]
查看>>
登录验证过滤器
查看>>
用NPOI操作EXCEL关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数
查看>>