Spring中事务嵌套这么用一定得注意了!!
最近项目上有一个使用事务相对复杂的业务场景报错了。在绝大多数情况下,都是风平浪静,没有问题。其实内在暗流涌动,在有些异常情况下就会报错,这种偶然性的问题很有可能就会在暴露到生产上造成事故,那究竟是怎么回事呢?
问题描述我们用一个简单的例子模拟下,大家也可以看看下面这段代码输出的结果是什么。
(相关资料图)
SecondTransactionService
定义一个简单接口transaction2
,插入一个用户,同时必然会抛出错误@Override@Transactional(rollbackFor = Exception.class)public void transaction2() { System.out.println("do transaction2....."); User user = new User("tx2", "111", 18); // 插入一个用户 userService.insertUser(user); // 跑错了 throw new RuntimeException();}
在另外一个类FirstTransactionService
定义一个接口transaction1
,它调用transaction2
方法,同时做了try catch
处理@Override@Transactional(rollbackFor = Exception.class)public void transaction1() { System.out.println("do transaction1 ......."); try { // 调用另外一个事务,try catch住 secondTransactionService.transaction2(); } catch (Exception e) { e.printStackTrace(); } // 插入当前用户tx1 User user = new User("tx1", "111", 18); userService.insertUser(user);}
定义一个controller
,调用transaction1
方法@GetMapping("/testNestedTx")public String testNestedTx() { firstTransactionService.transaction1(); return "success";}
大家觉得调用这个http
接口,最终数据库插入的是几条数据呢?
正确答案是数据库插入了0条数据。
同时控制台也报错了,报错原因是:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
是否和你预想的一样呢?你知道是为什么吗?
原因追溯其实原因很简单,我们都知道,一个事务要么全成功提交事务,要么失败全部回滚。如果出现在一个事务中部分SQL要回滚,部分SQL要提交,这不就主打的一个”前后矛盾,精神分裂“吗?
controller.testNestedTx() || / FirstTransactionService.transaction1() REQUIRED隔离级别 || || || 捕获异常,提交事务,出错啦 / || FirstTransactionService.transaction2() REQUIRED隔离级别 || || || 抛出异常,标记事务为rollback only =======================
事务的隔离级别为REQUIRED
,那么发现没有事务开启一个事务操作,有的话,就合并到这个事务中,所以transaction1()
、transaction2()
是在同一个事务中。transaction2()
抛出异常,那么事务会被标记为rollback only
, 源码如下所示:transaction1()
由于try catch
异常,正常运行,想必就要可以提交事务了,在提交事务的时候,会检查rollback
标记,如果是true, 这时候就会抛出上面的异常了。源码如下图所示:这下,是不是很清楚知道报错的原因了,那想想该怎么处理呢?
解决之道知道了根本原因之后,是不是解决的方案就很明朗了,我们可以通过调整事务的传播方式分拆多个事务管理,或者让一个事务"前后一致",做一个诚信的好事务。
将try catch
放到内层事务中,也就是transaction2()
方法中,这样内层事务会跟着外部事务进行提交或者回滚。@Override @Transactional(rollbackFor = Exception.class) public void transaction2() { try { System.out.println("do transaction2....."); User user = new User("tx2", "111", 18); userService.insertUser2(user); throw new RuntimeException(); } catch (Exception e) { e.printStackTrace(); } }
如果希望内层事务抛出异常时中断程序执行,直接在外层事务的catch
代码块中抛出e
,这样同一个事务就都会回滚。如果希望内层事务回滚,但不影响外层事务提交,需要将内层事务的传播方式指定为PROPAGATION_NESTED
。PROPAGATION_NESTED
基于数据库savepoint
实现的嵌套事务,外层事务的提交和回滚能够控制嵌内层事务,而内层事务报错时,可以返回原始savepoint
,外层事务可以继续提交。事务的传播机制前面提到了事务的传播机制,我们再看都有哪几种。
PROPAGATION_REQUIRED
:加入到当前事务中,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring中默认采用的方式。PROPAGATION_SUPPORTS
:支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY
:支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW
:新建一个事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER
: 以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED
:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED
类似的操作。如何理解PROPAGATION_NESTED
的传播机制呢,和PROPAGATION_REQUIRES_NEW
又有什么区别呢?我们用一个例子说明白。
serviceA.methodA()
以PROPAGATION_REQUIRED
修饰;定义serviceB.methodB()以
表格中三种方式修饰;methodA
中调用methodB
;总结在我的项目中之所以会报“rollback-only
”异常的根本原因是代码风格不一致的原因。外层事务对错误的处理方式是返回true或false来告诉上游执行结果,而内层事务是通过抛出异常来告诉上游(这里指外层事务)执行结果,这种差异就导致了“rollback-only
”异常。大家也可以去review自己项目中的代码,是不是也偷偷犯下同样的错误了。
欢迎关注个人公众号【JAVA旭阳】交流学习
标签:
推荐
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
每日快播:明冠新材:4月21日融券卖出1.87万股,融资融券余额1.98亿元
4月21日,明冠新材(688560)融资买入689 68万元,融资偿还894 78万元,融资净卖出205 1万元,融资余额1 97亿元。
来源: -
-
吉贝尔:4月21日融资买入227.92万元,融资融券余额4986.71万元
4月21日,吉贝尔(688566)融资买入227 92万元,融资偿还387 02万元,融资净卖出159 1万元,融资余额4986 71万元。
来源: -
-
-
天天视点!孚能科技:4月21日融券净卖出1.67万股,连续3日累计净卖出5.27万股
4月21日,孚能科技(688567)融资买入663 98万元,融资偿还1114 9万元,融资净卖出450 92万元,融资余额5 36亿元。
来源: -
-
-
-
-
-
-
财富更多》
-
天天快讯:涂鸦智能美股跌8.45%
涂鸦智能美股跌8 45%---中国经济网北京...
-
环球动态:禾赛科技美股跌9.94%
禾赛科技美股跌9 94%---中国经济网北京...
-
今日热讯:金山云美股跌9.73%
金山云美股跌9 73%---中国经济网北京4...
-
每日关注!经济增长内生动力进一步增强
经济增长内生动力进一步增强---在这样的...
-
全球资讯:凤凰新媒体美股涨19.00%
凤凰新媒体美股涨19 00%---中国经济网...
动态更多》
热点
- realme10系列正式宣布 采用双曲面屏正面顶部居中挖孔
- 五菱全新微型电动车内饰官图发布 座椅采用星际形打孔工艺
- 努比亚Z40星空典藏版正式开售 采用微米级油画笔触纹理技术
- iQOO11系列正式官宣 首批搭载骁龙8Gen2机型之一
- 海信34英寸带鱼屏显示器发布 支持165Hz刷新率
- OPPO明年将商用240W超级闪充 新一代电芯支持更高倍率充电
- 第一款Android手机渲染图曝光 横向滑盖设计和全尺寸键盘
- 吉利首款纯电皮卡11月9日上市 车辆续航里程超过610公里
- 努比亚Z40SPro星空典藏版正式公布 堪称窄边框天花板
- vivo无线运动耳机2今日正式上市 首销只要119元
- 实时:跟风涨价往往得不偿失
- 最新资讯:【文体市场面面观】旅游专列拉近“诗与远方”
- 索尼互娱宣布收购游戏工作室Firewalk
- 视点!德国经济复苏整体趋好
- 世界快资讯丨一支劲旅准备佯攻微信
- 环球今日报丨长远锂科:4月21日融资买入1498.15万元,融资融券余额5.36亿元
- 浦发银行食言30%的分红比例 分红事小失信事大
- 美媒:美政府机密文件泄露实际时间比已知时间更早数月
- 环球下周看点:信息量很大!美股Q1财报季即将迎来最高潮
- 环球快看:剑灵有哪些职业_游戏剑灵所有职业和职业特点
- 视焦点讯!迅雷下载速度0怎么回事_解决方法说明
- 空调外机声音大怎么回事_空调外机声音大原因
- 看热讯:"TOP GUN·耀非凡”——2023年度隽星盛典云巅启幕!
- 大森控股(01580)4月21日发行7310.4万股
- 焦点短讯!魅族PANDAER×IQUNIX热爱无界超旋音机械键盘开卖
- 全球热文:越秀交通基建(01052):完成发行8亿元超短期融资券
- 高速离心喷雾干燥机_关于高速离心喷雾干燥机简述
- China’s Tourism in May Day Holidays Set to Rebound to Pre-pandemic Level
- 中国中铁(00390)第一季度新签合同额6673.8亿元 同比增长10.2%
- 全球球精选!75瓦电热毯能在宿舍用吗?
- 7度天气可以用电热毯吗?
- 每日讯息!电热毯使用过多的危害?
- 播报:最高法:以居住为目的 全款购房的交付请求权,优先于建设工程价款优先受偿权 抵押权及其他债权
- 快消息!新官上任三把火!Lyft(LYFT.US)CEO计划“大幅裁减”员工人数
- 世界关注:CBA新消息,赵继伟伤情更新,马布里主动示好首钢,3队换帅成定局
- 环球讯息:强生(JNJ.US)旗下杨森的抑郁症疗法在中国获批
- 黑入iPhone仅需一条iMessage消息!多起NSO“零点击”攻击曝光
- 揭秘:溥仪的文化水平究竟有多高?专家:至少是个博士生!
- 关于友谊的诗句或名言_关于友谊的诗
- excel案例分享:表格中上百个竖排姓名如何打印到一页纸上面
- 信息:为什么说东风雪铁龙的目标,是让你“享受生活”?
- 南网储能:签订肇庆绿色能源项目开发框架协议
- 今头条!说明顺序作文 说明顺序
- 四川广汉:种下一片林 守望鹭鸟“春归”
- 焦点速递!造成温室效应的六种温室气体-什么是温室效应 产生温室效应的气体有哪些
- 当前热讯:早春红玉西瓜
- 当前速递!三工视频·新360行之AI训练师|给“机器人”当师父的全国劳模
- 力元君哔哩哔哩空间 卫元君
- 天天观点:联合国中文日主题活动开幕
- 【聚看点】塞上绿洲羊肉鲜:山西右玉向外推介
- 世界通讯!山东省一本大学一览表_山东省一本大学
- 上海:以虚强实是推进元宇宙发展的“必由之路”
- 当前速递!大唐推出aln-10itx主板:内置英特尔n系列处理器
- 环球看点!成都一项社区群众性体育活动创造吉尼斯世界纪录
- 全球微资讯!挪威钱币对人民币兑换_韩国钱币兑换人民币
- 【当前独家】小学生手册家长评语诗词_小学生手册家长评语
- 搬家注意事项有哪些_搬家注意事项
- 美股收盘:三大指数延续横盘走势 科技股财报或指明方向
- 全球速递!【盘中宝】订单涌向国内企业,该半导体关键原料供应紧张,部分特定替代品今年供应都已全数售罄,这家公司相关产品实现国内外市场的批量交付
- 片仔癀今日大宗交易平价成交16.71万股,成交额4497.66万元
- 俄在日本海水域演练“摧毁敌航母战斗群”
- 【全球热闻】好数据成坏消息!美PMI超预期走强 联储加息又获支撑
- 锐奇股份(300126.SZ):一季度净亏损152.42万元
- 2023年上海力争新增供应6万套(间)保租房
- 世界聚焦:武汉东湖新技术开发区探索果絮综合治理模式,法桐飘絮难题有望得到缓解
- 天天速递!第三届武汉应博会4月26日开幕,一大批高精尖应急救援装备将亮相
- 我爱我家北京市场扩张“冻结”,店多人少服务待改进,战略股东被深套后仍亏损减持
- 避暑消夏好去处!晋城邀约武汉游客“太行山上过夏天”
- V观财报|涉减持违规,大港股份原副董事长王刚收警示函
- 环球最新:“聚焦2023年一季度经济数据”系列报道 一季度人民币汇率双向波动小幅升值 企业要树立汇率风险中性理念
- 今日最新!小米13 Ultra发布,联合徕卡打造影像机皇,售价5999
- 研报掘金 | 东吴证券:容百科技Q1业绩符预期 维持“买入”评级
- 京东方独供vivoxflip折叠手机内外双幕
- 环球观热点:V观财报|东方财富一季度净利同比降6.54%,管理费用增近1亿
- 环球今热点:长城汽车总裁穆峰:新能源下半场竞争的是「体系与生态」| 大宝访谈
- 今亮点!究竟是白酒不懂年轻人,还是年轻人不懂白酒?
- 23年8月frm考试时间一览表,还不知道的快看!
- 【焦点热闻】为什么短视频刷多了后,没有刚开始刷的时候快乐?
- 【环球新视野】绿地元宇宙指数G-Meta Index预计下周将探明近期低点
- 同济复旦一联合科研成果入选“2022中国光学十大进展”
- 天天关注:两家银行网点证实:深圳二手房贷款不再依据官方参考价
- 前沿热点:市值蒸发163亿!宝马MINI再道歉,却拉黑网友?多位专家辣评“黑天鹅”事件
- 教育部:毕业生求职需警惕陷阱
- 最新:耶伦说中方提案“不太认真”,外交部:呼吁美方采取负责态度,为乌克兰危机的政治解决作出努力
- 今日最新!比亚迪电子跌超5%,一季度全球智能手机市场同比下跌12%
- 环球新消息丨【新机】小米Civi3获认证 充电依然67W 天玑8200打友商778G?
- 焦点滚动:管理规模缩至889亿,贵州茅台重登张坤第一重仓股
- 世界最新:国家邮政局:一季度邮政行业业务收入累计完成3562.1亿元 同比增长9%
- 麦当劳vs肯德基,谁才是中国人最爱
- 淡马锡回应减持工商银行H股:对投资组合再平衡
- 一季度全国网上零售额3.29万亿元,同比增8.6%
- 环球聚焦:女子疑被骗入传销 城管出手相助!
- 老外是员工有无证据?宝马:会反馈 基本情况讲解
- “东数”实现“西算”要迈几道坎
- 德国5月1日起对中国公民重新开放旅游签证
- 热门看点:首届京津冀户外运动产业峰会举办
- 当前动态:吴艳破抓举全国纪录
- 环球资讯:20家最具潜力的零信任创业公司
- 热消息:量旋科技项金根:推动量子计算落地应用,使其成为生产力工具
- 每日头条!中通快递:独立调查已基本完成,做空机构灰熊指控“没有得到证实”
- 今亮点!中国金鸡百花电影节长期落户厦门
- 全球头条:南山集团8亿元公司债将付息 利率5.30%
- 环球即时:宣城加快建设多层次资本市场
- 热点!妈妈是一名英语老师作文(通用27篇)
- dlc涂层百度百科_dlc涂层是什么意思
- 【天天报资讯】鹅厂是哪个公司 腾讯为什么叫鹅厂爱吃西红柿的女星_鹅厂是哪个公司
- 天天即时看!处罚决定书编号查询网丢了_处罚决定书编号查询网
- 世界微动态丨首届中欧绿色创新发展大会在江门举办
- 妈妈和老师英语作文初一(通用49篇)
- 热文:中国互联网络信息中心官方网站
- 大学英语作文我的妈妈范文(共23篇)
- 全球快播:上汽大通领地新车型上市 售价22.88万元
- 世界观察:更显精致美感 新款吉利ICON主角官图发布
- 短尾突吻鳗
- 当前速讯:观点|奥迪中国温泽岳:奥迪一汽新能源工厂年底建成
- 全球视讯!股票行情快报:绝味食品(603517)4月21日主力资金净买入1296.83万元
- 环球快报:股票行情快报:宏发股份(600885)4月21日主力资金净卖出420.64万元
- 环球快播:国v与vl(国v和国vl是什么区别)
- 股票行情快报:临港B股(900928)4月21日游资资金净卖出540.00元
- 世界热文:民营企业发展特写:转变、创新、追求
- 【世界报资讯】蜘蛛有几只眼睛(蜘蛛有几只眼睛)
- 全球新消息丨赛尔号元神珠孵化芯片(赛尔号元神珠)
- 环球百事通!新手养猫注意事项初学者养猫注意事项(新手养猫注意事项)
- 信访干部培训工作计划表(合集14篇)
- 动态:商务谈判的工作计划范文(优选12篇)
- 当前通讯!平安健康发布《中国中小企业家健康管理认知研究报告》
- 环球看点!县政府小食堂工作计划(合集4篇)
- 宝马MINI展台仍在发放小礼品 基本信息讲解
- 环球今日讯!受资金青睐 多只银行股走强
- 全球微资讯!女子吐槽软卧车厢分配3男1女 基本信息讲解
- 世界今头条!规范旅游市场价格 北京市开展专项执法
- 通讯!宝马mini展台不发冰淇淋改发钥匙扣 基本情况讲解
- 国安顾问宣布辞职 巴西总统卢拉已同意
- 世界关注:今年市场监管总局严打8类违法行为
- 环球微速讯:360借条网贷逾期了会不会起诉