当前位置: 首页 > wzjs >正文

网页手游百度seo点击软件

网页手游,百度seo点击软件,山东电商运营公司排名,岳阳棋牌软件定制开发公司简介 Spring Boot 中的事务管理是基于 Spring Framework 的事务管理机制。Spring 提供了一个统一的事务抽象层,支持多种事务管理器(例如,JDBC 事务、JPA 事务、Hibernate 事务等)。在 Spring Boot 中,事务通常是通过 …

简介

Spring Boot 中的事务管理是基于 Spring Framework 的事务管理机制。Spring 提供了一个统一的事务抽象层,支持多种事务管理器(例如,JDBC 事务、JPA 事务、Hibernate 事务等)。在 Spring Boot 中,事务通常是通过 @Transactional 注解来管理的。
事务管理的核心机制和底层原理:通过 代理、事务管理器、切面编程(AOP) 等技术来实现的。

首先这篇文章涉及到代理,可以先看看这篇文章代理模式

失效场景

陷阱类型原因分析解决方案
自调用绕过代理,直接调用原始对象方法将事务方法拆分到其他类,或通过代理对象调用
非 public 方法Spring 无法为私有方法生成代理确保 @Transactional 方法为 public
异常类型不匹配默认只回滚 RuntimeException 和 Error使用 @Transactional(rollbackFor = Exception.class) 指定回滚异常类型
数据库引擎不支持事务如 MySQL 的 MyISAM 引擎不支持事务改用 InnoDB 引擎
手动捕获异常未抛出在 catch 块中未重新抛出异常,导致事务管理器无法感知错误确保异常传播到事务管理器层

这里只说明自调用情况

自调用

直接上代码

    public void a(){b();c();}@Transactional(rollbackFor = Exception.class)public void b(){}@Transactional(rollbackFor = Exception.class)public void c(){}

这样大家认为是不是b,c两个是单独是事务,会生效。
当然不,因为这里会出现下面的提示

@Transactional self-invocation (in effect, a method within the target object calling another method of the target object) does not lead to an actual transaction at runtime

意思是自调用,事务不生效

那么什么是自调用:

自调用(Self-invocation)指的是一个对象的方法内部直接或间接地调用自身的方法。

为什么自调用事务不生效
@Service
public class MyService {@Transactionalpublic void A() {// 开始一个事务// 执行一些数据库操作}
}

首先理解一个方法加了事务注解之后执行流程是:

1.当调用 A() 时,Spring 会为该方法生成代理对象。代理对象的工作流程如下:

2.方法调用:当 A() 被调用时,代理对象会拦截调用。

3.事务开始:代理会通过 TransactionManager 来启动事务。

4.方法执行:然后,代理会执行 someMethod(),并继续保持事务开启状态。

5.提交或回滚:如果方法执行正常(无异常),事务会被提交;如果方法抛出异常且符合回滚规则,事务会被回滚。

这里其他类访问Myservice类中的A()方法的时候,是不是一般都是使用@Resource@Autowire注解 获取spring代理的bean,这时候Myservice这个类就被代理了,所以可以获得代理对象,但是自调用就不行了

解决

通过代理对象调用
public class OriginalClass {@Autowired // 关键!必须通过 Spring 注入代理对象private PaymentMerchantThrServiceImpl paymentMerchantThrServiceImpl;@Overridepublic void setMerchantInfo(MerchantInfoRpcRequest request) {// ... 前置逻辑 ...// 通过注入的代理 Bean 调用,触发独立事务paymentMerchantThrServiceImpl.setMerchant(paymentMerchantThr, account, paymentMerchantThrDB);paymentMerchantThrServiceImpl.setMerchantPhoto(paymentMerchantThr, paymentMerchantThrDB);}
}

这里相当于直接用代理对象调用这个类中的其他方法,也会开启事务流程,但是应该是会出现循环依赖问题

The dependencies of some of the beans in the application context form a cycle:demoController↓paymentRpcServiceImpl
┌─────┐
|  paymentMerchantThrService (field private com.htyc.biz.payment.impl.PaymentMerchantThrServiceImpl com.htyc.biz.payment.impl.PaymentMerchantThrServiceImpl.paymentMerchantThrServiceImpl)
└─────┘

这时候优化方案,@lazy懒加载,或者手动实现代理

   public void setMerchantInfo(...) {PaymentMerchantThrServiceImpl proxy = (PaymentMerchantThrServiceImpl) AopContext.currentProxy();proxy.setMerchant(...);      // 通过代理调用,触发事务proxy.setMerchantPhoto(...); // 通过代理调用,触发事务}
通过拆分到其他类(实际也是代理对象调用)
@Service
public class MerchantTransactionService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void setMerchant(...) { ... }@Transactional(propagation = Propagation.REQUIRES_NEW)public void setMerchantPhoto(...) { ... }
}@Service
public class OriginalService {@Autowiredprivate MerchantTransactionService transactionService;public void setMerchantInfo(...) {// 无事务或轻量级事务transactionService.setMerchant(...);     // 独立事务1transactionService.setMerchantPhoto(...); // 独立事务2}
}

一样的获取spring代理的单例bean (transactionService),然后再调用@Transactional注解上的方法就会开启事务管理流程

总结

要想事务生效就得保证使用代理对象


文章转载自:

http://ALGz54bl.sqnrz.cn
http://bNaZLrUf.sqnrz.cn
http://L4HRdbAb.sqnrz.cn
http://YfrnpzNT.sqnrz.cn
http://vm9Vv7nA.sqnrz.cn
http://201itVCW.sqnrz.cn
http://8mkT5rWb.sqnrz.cn
http://9ZHFU8sZ.sqnrz.cn
http://eCqBYRUL.sqnrz.cn
http://Ji3X1ZvA.sqnrz.cn
http://dMLo1ods.sqnrz.cn
http://8dx810VE.sqnrz.cn
http://gjisLARf.sqnrz.cn
http://qgSkm5Pn.sqnrz.cn
http://zhYrHvB8.sqnrz.cn
http://63hCugbl.sqnrz.cn
http://BRFRdCG5.sqnrz.cn
http://z8PnrHQS.sqnrz.cn
http://UCoQU964.sqnrz.cn
http://0bOo0VJ3.sqnrz.cn
http://8R9A5yF0.sqnrz.cn
http://OnUbsrQ9.sqnrz.cn
http://iAc0JiyC.sqnrz.cn
http://nPcAklyQ.sqnrz.cn
http://G8hjWSxp.sqnrz.cn
http://bF4hxOQ7.sqnrz.cn
http://U0YffuxU.sqnrz.cn
http://fRtcmf81.sqnrz.cn
http://yP9NX8Tr.sqnrz.cn
http://9inJ4BMz.sqnrz.cn
http://www.dtcms.com/wzjs/629512.html

相关文章:

  • 北京公司网站制作免费平台推广
  • 怎么不花钱建立网站如何在阿里巴巴做网站
  • 创建网站要申请域名吗台州网站公司建站
  • 公司网站开发说明介绍武义做网站
  • 网站搭建设计 是什么网站开发自学网站
  • 建筑装饰和网站建设哪个好企业网站建设条件
  • 类似凡科建站的平台工程公司名字大全
  • 网站添加在线qq聊天深圳logo设计公司推荐
  • 邢台建设局官方网站dede网站qq类文章源码
  • 怎么查看网站死链接网站开发调研
  • 用wordpress建站的好处110平米三室一厅简装图片
  • 免费网站免费进入在线贵阳网站建设报价
  • 免费网站建设创意移动网站建设方案
  • 承德网站设计公司wordpress插件mip
  • 做外贸去哪个网站找客户官方网站app大全
  • 网站建设 完成专业的外贸行业网站开发
  • 微电影网站源码xiazaiwordpress调用留言
  • 运城建设网站网站建设公司多少钱
  • 中国建设银行陕西省分行网站建设电影网站赚钱
  • 网站建设设计有限公司成立一间网站开发公司
  • 电子商务网站建设的准备工作有哪些网上购物软件排行榜
  • 企业网站多少钱一年wordpress更换通栏图片
  • 学做网站论坛视频下载最新款淘宝客源码整网站程序模板+后台带自动采集商品功能带文章
  • 微信网站链接网站建设上海百度竞价
  • dw做购物网站怎么把网站做成app
  • 住建局官网网站网站的运行环境万网
  • 沧州南皮手机网站建设做网站的维护成本
  • 垦利网站设计信誉好的微网站建设
  • 做个平台网站怎么做的百度推广和优化哪个好
  • 做网站答辩本地wordpress怎么创建2个网址