spring的事务提交与回滚机制
发布日期:2021-06-30 13:44:21
浏览次数:2
分类:技术文章
本文共 1677 字,大约阅读时间需要 5 分钟。
事务超时:
@Transactional(timeout = 60)
如果用这个注解描述一个方法的话,线程已经跑到方法里面,如果已经过去60秒了还没跑完这个方法并且线程在这个方法中的后面还有涉及到对数据库的增删改查操作时会报事务超时错误(会回滚)。如果已经过去60秒了还没跑完但是后面已经没有涉及到对数据库的增删改查操作,那么这时不会报事务超时错误(不会回滚)。
回滚:
答案是 RuntimeException或者Error,即unchecked Exception 详见
注意:如果事务在
try{
}catch( Exception e ){
e.printStackTrace();
}
中跑,并且catch中只是打印e的话,那么事务不会rollback。因为异常被catch掉了,框架不知道发生了异常。
如果想要rollback,可以加上rollbackFor=Exception.class,然后:
①在方法上添加 throws Exception,将方法中出现的异常抛出给spring事务,
②去掉方法体中的try catch
③catch (Exception e) { throw e;}继续向上抛,目的是让spring事务捕获这个异常。
④不加rollbackFor=Exception.class,catch(){
throw new RunTimeException();
}
如果不加rollbackFor=Exception.class,抛出new Exception() 是不会回滚的。Spring源码如下:
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
如果是RuntimeException或Error的话,就返回True,表示要回滚,否则返回False,表示不回滚。
只有spring事务捕获到Exception异常后,@Transactional(rollbackFor=Exception.class),
才会起到应有的作用;
catch (Exception e) {
e.printStackTrace();
}
这句是捕获try中出现的Exception然后将异常信息打印出来,仅仅是打印出来,然后什么也没干。
@Transactional(timeout = 60,rollbackFor=Exception.class)与@Transactional(timeout = 60)区别:
rollbackFor=Exception.class的作用是 让checked例外也回滚,即让编译错误也回滚。
需要注明的是:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)checked exception是编译时的错误,Unchecked exception是运行时错误,详见
转载:http://blog.csdn.net/heweimingming/article/details/51841133
附:
今天做一个插入操作时发现事务不起作用,尝试了各种办法都没有奏效,结果发现是mysql数据库使用的引擎类型是MYISAM,这种引擎是不支持事务的,于是更换为innodb。
另外想说的是,在springmvc的service层处理事务时,可以在service使用try..catch..,catch中主动抛出.运行时异常,方法上写@Transactional即可,异常抛给controller处理。另外一种办法,service不catch,也不用throws,直接就是@Transactional。
转载地址:https://jeffsheng.blog.csdn.net/article/details/78444359 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月22日 23时53分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【接口自动化】
2019-05-01
SpringBoot搭建一个Web工程
2019-05-01
Spring Boot 安全框架 Shiro 入门
2019-05-01
如何用一句话激怒互联网人?
2019-05-01
用 Python 爬了点你们喜欢的电影
2019-05-01
推荐一位川大零基础转行 Python 的人生勇士
2019-05-01
讲真,做Python一定不要只会一个方向!
2019-05-01
Python 2大限来了!113天后自生自灭,官方不再维护更新
2019-05-01
GitHub 热榜第一的 Python 抢票神器!节假日能用上
2019-05-01
1.6w 星开源项目,但作者月薪却不到 5K
2019-05-01
Python解惑之:整数比较
2019-05-01
Python解惑之:True与False
2019-05-01
你要的微信小程序终于来了
2019-05-01
我的2016书单
2019-05-01
冷眼看小程序
2019-05-01
为什么执行 x in range(y) 如此快?
2019-05-01
看完这篇文章你还不理解 Python 装饰器,只有一种可能...
2019-05-01
Python干货:表达式 i += x 与 i = i + x 等价吗?
2019-05-01
有了这些 Chrome 插件,效率提升10倍(建议收藏)
2019-05-01
Python 编码错误的本质原因
2019-05-01