当前位置: 首页 > news >正文 湖南昌正建设有限公司网站自定义域名 news 2025/10/24 3:48:29 湖南昌正建设有限公司网站,自定义域名,php网站开发实训实践总结,网站建设文字Spring事务传播机制 1.什么是事务传播机制#xff1f;2.Spring事务传播类型Propagation介绍3.具体案例总结 Spring事务传播机制 1.什么是事务传播机制#xff1f; 举个栗子#xff0c;方法A是一个事务的方法#xff0c;方法A执行过程中调用了方法B#xff0c;那么方法B有…Spring事务传播机制 1.什么是事务传播机制2.Spring事务传播类型Propagation介绍3.具体案例总结 Spring事务传播机制 1.什么是事务传播机制 举个栗子方法A是一个事务的方法方法A执行过程中调用了方法B那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响同时方法A的事务对方法B的事务执行也有影响这种影响具体是什么就由两个方法所定义的事务传播类型所决定。 简单说就是我们方法调用通常是一个方法调用另外一个而不同方法可以有不同的事务所以传播机制就是指在多个方法事务要如何传播。 2.Spring事务传播类型Propagation介绍 一共有七种传播类型 Propagation.REQUIREDPropagation.SUPPORTSPropagation.MANDATORYPropagation.REQUIRED_NEWPropagation.NOT_SUPPORTEDPropagation.NESTEDPropagation.NEVER 本文从案例结合解释一下不同传播类型下多个Transactional方法会发生什么在遇到异常情况下不同传播机制会产生什么影响。 1. Propagation.REQUIRED 这是默认的传播机制我们最常用的一种也是Transactional默认的一种 如果当前没有事务则自己新建一个事务如果当前存在事务则加入这个事务 1 2 3 4 5 6 7 8 9 10 11 12 // 示例1 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.REQUIRED) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 简单来说就是开启一个事务上面的案例就是当main方法如果没开启事务那么sub方法就会开启如果main方法已经Transactional开启了事务sub方法就会加入外层方法的事务所以上面方法执行在遇到异常时候会全部回滚 结果 A、B、C全部无法插入。 1 2 3 4 5 6 7 8 9 10 11 // 示例2 public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.REQUIRED) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 结果 A插入成功BC开启新的事务遇到异常回滚B、C无法插入 2. Propagation.SUPPORTS 当前存在事务则加入当前事务如果当前没有事务就以非事务方法执行 1 2 3 4 5 6 7 8 9 10 11 // 示例3 public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.SUPPORTS) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 这个和REQUIRED很像但是里层的sub方法事务取决于main方法如果main方法有开启那么里面的就和外层事务一起如果发生异常全部回滚。 结果 A、B插入成功C无法插入因为发生异常 3. Propagation.MANDATORY 当前存在事务则加入当前事务如果当前事务不存在则抛出异常。 1 2 3 4 5 6 7 8 9 10 11 // 示例4 public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.MANDATORY) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 这种情形的执行结果就是insertA存储成功而insertB和insertC没有存储。b和c没有存储并不是事务回滚的原因而是因为main方法没有声明事务在去执行sub方法时就直接抛出事务要求的异常如果当前事务不存在则抛出异常所以sub方法里的内容就完全没有执行。 结果 A插入成功B、C无法插入方法抛出异常 那么当main方法有事务的情况下 1 2 3 4 5 6 7 8 9 10 11 12 // 示例5 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.MANDATORY) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 结果 A、B、C全部无法插入A、B回滚 4. Propagation.REQUIRED_NEW 创建一个新事务如果存在当前事务则挂起该事务。 1 2 3 4 5 6 7 8 9 10 11 12 // 示例5 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 throw RuntimeException; //发生异常抛出 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.REQUIRES_NEW) public void sub(){ insertB(); //插入B insertC(); //调用C 因为sub方法会开启一个新的事务所以main方法抛出的异常并不会影响sub方法的提交 结果 A插入失败B、C能插入成功 5. Propagation.NOT_SUPPORTED 始终以非事务方式执行,如果当前存在事务则挂起当前事务 1 2 3 4 5 6 7 8 9 10 11 12 // 示例6 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.NOT_SUPPORTED) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 示例6因为当main方法有事务的时候就会挂起当前事务即main以事务运行sub不以事务运行 所以最终结果 A因为sub抛出异常事务回滚插入失败B因为不以事务运行插入成功C因为遇到异常后续不会执行所以插入失败。 1 2 3 4 5 6 7 8 9 10 11 // 示例7 public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.NOT_SUPPORTED) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 示例7这种情况就是所有方法都不会以事务运行A、B均能插入成功C无法插入 6. Propagation.NEVER 不使用事务如果当前事务存在则抛出异常 1 2 3 4 5 6 7 8 9 10 11 // 示例7 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.NEVER) public void sub(){ insertB(); //插入B insertC(); //调用C sub因为是Never所以是不会执行直接抛出错误所以main的事务遇到异常直接回滚所以A回滚无法插入B、C不会插入。 7. Propagation.NESTED 如果当前事务存在则在嵌套父子事务中执行否则REQUIRED的操作一样开启一个事务 1 2 3 4 5 6 7 8 9 10 11 12 // 示例7 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A service.sub(); // 调用其他方法 throw RuntimeException; //发生异常抛出 } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.NESTED) public void sub(){ insertB(); //插入B insertC(); //调用C 这个是最需要理解的一种传播机制要理清楚嵌套父子事务main的是父事务sub是子事务main发生异常全部都会回滚。 结果 A、B、C全部回滚 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // 示例8 Transactional(propagation Propagation.REQUIRED) public void main(){ insertA(); // 插入A try { service.sub(); // 调用其他方法 } catch (Exception e) { } insertD(); } // 两个Service中调用如果同一个要注意不能用this调用事务不会起作用 Transactional(propagation Propagation.NESTED) public void sub(){ insertB(); //插入B throw RuntimeException; //发生异常抛出 insertC(); //调用C 示例8子事务发生异常抛出但父事务catch掉了那么这个时候main方法就相当于正常执行没有发生异常那么就只有子事务回滚。 结果 A、D插入成功B、C插入失败 REQUIRED 内外同一个事务任何一个地方抛出异常全部一起回滚。REQUIRED_NEW 内部开启一个新的事务外部事务回滚并不会影响内部的事务而如果内部事务抛出被catch也不会影响外部事务。 怎么样快速记忆七个分四组221这样记两个一对互相类似 组传播类型含义group1Propagation.REQUIRED如果当前已有事务则加入当前事务否则开启新的事务group1Propagation.REQUIRED_NEW无论当前是否有事务都开启新的事务group2Propagation.SUPPORTED如果当前事务存在就加入事务否则以非事务运行group2Propagation.NOT_SUPPORTED始终以非事务方式执行,如果当前存在事务则挂起当前事务group3Propagation.NEVER不使用事务如果当前事务存在则抛出异常group3Propagation.MANDATORY当前存在事务则加入当前事务如果当前事务不存在则抛出异常。group4Propagation.NESTED父子嵌套事务父回滚全回滚子回滚不影响父事务 3.具体案例 单纯讲案例比较枯燥会觉得工作中什么情况会使用到呢这边就举一个例子来讲解一下。 在下单时候我们最主要是写入订单、然后添加积分最后记录日志 1 2 3 4 5 6 7 8 9 10 11 12 13 Service public class OrderServiceImpl implements OrderService{ Transactional public void placeOrder(OrderDTO orderDTO){ try { pointService.addPoint(Point point); } catch (Exception e) { // 记录错误信息 } //省略... } //省略... } 1 2 3 4 5 6 7 8 9 10 11 12 13 Service public class PointServiceImpl implements PointService{ Transactional(propagation Propagation.NESTED) public void addPoint(Point point){ try { recordService.addRecord(Record record); } catch (Exception e) { //省略... } //省略... } //省略... } 1 2 3 4 5 6 7 8 Service public class RecordServiceImpl implements RecordService{ Transactional(propagation Propagation.NOT_SUPPORTED) public void addRecord(Record record){ //省略... } //省略... } 下单的操作不会影响添加积分的操作所以我们使用NESTED下单只要成功添加积分可以成功或失败失败的话就错误信息后续补偿。而记录日志我们可以有也可以没有就可以设置为NOT_SUPPORTED不开启事务使得事务的方法能尽可能的精简避免一个很大的事务方法。 总结 本文讲解了Spring事务的七种传播机制我们可以根据具体的类型具体设置避免事务的方法过于长一个事务里面调用的库表越多就越有可能造成死锁所以我们要根据具体的需要拆分使用。 文章转载自: http://www.morning.btlmb.cn.gov.cn.btlmb.cn http://www.morning.hnzrl.cn.gov.cn.hnzrl.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.dybth.cn.gov.cn.dybth.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.crkhd.cn.gov.cn.crkhd.cn http://www.morning.iuibhkd.cn.gov.cn.iuibhkd.cn http://www.morning.gygfx.cn.gov.cn.gygfx.cn http://www.morning.nmngq.cn.gov.cn.nmngq.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.rjqtq.cn.gov.cn.rjqtq.cn http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.hjbrd.cn.gov.cn.hjbrd.cn http://www.morning.mlgsc.com.gov.cn.mlgsc.com http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn http://www.morning.xbwqg.cn.gov.cn.xbwqg.cn http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.fgkwh.cn.gov.cn.fgkwh.cn http://www.morning.rccpl.cn.gov.cn.rccpl.cn http://www.morning.rkzk.cn.gov.cn.rkzk.cn http://www.morning.ytfr.cn.gov.cn.ytfr.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn http://www.morning.xsetx.com.gov.cn.xsetx.com http://www.morning.fysdt.cn.gov.cn.fysdt.cn http://www.morning.qrmry.cn.gov.cn.qrmry.cn http://www.morning.lggng.cn.gov.cn.lggng.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn http://www.morning.jnkng.cn.gov.cn.jnkng.cn http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.wnmdt.cn.gov.cn.wnmdt.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.nrfrd.cn.gov.cn.nrfrd.cn http://www.morning.xckqs.cn.gov.cn.xckqs.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.hcszr.cn.gov.cn.hcszr.cn http://www.morning.grzpc.cn.gov.cn.grzpc.cn http://www.morning.kmbgl.cn.gov.cn.kmbgl.cn http://www.morning.lywcd.cn.gov.cn.lywcd.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.wyppp.cn.gov.cn.wyppp.cn http://www.morning.qtzqk.cn.gov.cn.qtzqk.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.fnlnp.cn.gov.cn.fnlnp.cn http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn http://www.morning.krzrg.cn.gov.cn.krzrg.cn http://www.morning.czqqy.cn.gov.cn.czqqy.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.lgnbr.cn.gov.cn.lgnbr.cn http://www.morning.jbgzy.cn.gov.cn.jbgzy.cn http://www.morning.rgpy.cn.gov.cn.rgpy.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.rqrxh.cn.gov.cn.rqrxh.cn http://www.morning.lnfkd.cn.gov.cn.lnfkd.cn http://www.morning.wnzgm.cn.gov.cn.wnzgm.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.ygbq.cn.gov.cn.ygbq.cn http://www.morning.rfgkf.cn.gov.cn.rfgkf.cn http://www.morning.mdwtm.cn.gov.cn.mdwtm.cn http://www.morning.cspwj.cn.gov.cn.cspwj.cn http://www.morning.smspc.cn.gov.cn.smspc.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn http://www.morning.bfysg.cn.gov.cn.bfysg.cn http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn http://www.morning.rdwm.cn.gov.cn.rdwm.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.bppml.cn.gov.cn.bppml.cn 查看全文 http://www.tj-hxxt.cn/news/244305.html 相关文章: 网站哪些页面会做静态化百度自媒体怎么注册 站群系统软件学校建设微网站的方案 赫章网站建设宁波哪里有做网站的 建站网络公司wordpress安装如何填数据库 上海定制网站建设wordpress的wp_list_cats 招聘网站建设与开发要求wordpress+采集评论 招聘网官方网站莱芜网站开发 网站备案 收费网站建设的国内外现状 扶余手机网站开发公司让别人做网站需要注意什么问题 设计网站中企动力优陕西省住房与城乡建设厅网站 运城网站建设维护如何网络推广运营 做网站能带来什么北京东城做网站 教育网站建设解决方案网站页脚设计的几个小技巧 二次开发的意义厦门seo优化多少钱 仿皮皮淘网站开发全程培训网推一手单渠道 营销型网站有哪些平台怎么注册自己的品牌 网站软件推荐在线图片转链接生成器 网站优化人员通常会将目标关键词放在网站首页中的网页设计手机版app下载 东莞学校网站建设重生做明星那个网站下载 济南网站建设 齐鲁文化创意基地滨州市滨城区建设局网站 毕业设计网站开发实施步骤国外交互设计网站欣赏 温州建网站成都小程序建设廴成都柚米 网站建设昆山花桥外贸销售管理制度 页面设计报告电子商务seo是什么意思 沭阳做网站shy1z传媒公司网站php源码 网站的交互体验郑州制作网页的公司 门户网站建设情况简介本溪市网站建设 小型公司网站建设论文物流网站建设方案范文 养殖网站模板网站正在建设中html 3个典型网站建设公司服务器免费