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

晋江网站设计泉州名扬专业金华网站建设团队

晋江网站设计泉州名扬专业,金华网站建设团队,用DW做的网站生成链接,万网的网站建设是什么EnableTransactionManagement工作原理 开启Spring事务本质上就是增加了一个Advisor#xff0c;但我们使用EnableTransactionManagement注解来开启Spring事务是#xff0c;该注解代理的功能就是向Spring容器中添加了两个Bean#xff1a; AutoProxyRegistrarProxyTransactio…EnableTransactionManagement工作原理 开启Spring事务本质上就是增加了一个Advisor但我们使用EnableTransactionManagement注解来开启Spring事务是该注解代理的功能就是向Spring容器中添加了两个Bean AutoProxyRegistrarProxyTransactionManagementConfiguration AutoProxyRegistrar主要的作用是向Spring容器中注册了一个InfrastructureAdvisorAutoProxyCreator的Bean。 而InfrastructureAdvisorAutoProxyCreator继承了AbstractAdvisorAutoProxyCreator所以这个类的主要作用就是开启自动代理的作用也就是一个BeanPostProcessor会在初始化后步骤中去寻找Advisor类型的Bean并判断当前某个Bean是否有匹配的Advisor是否需要利用动态代理产生一个代理对象。 ​ ​ ProxyTransactionManagementConfiguration是一个配置类它又定义了另外三个bean BeanFactoryTransactionAttributeSourceAdvisor一个AdvisorAnnotationTransactionAttributeSource相当于BeanFactoryTransactionAttributeSourceAdvisor中的PointcutTransactionInterceptor相当于BeanFactoryTransactionAttributeSourceAdvisor中的Advice AnnotationTransactionAttributeSource就是用来判断某个类上是否存在Transactional注解或者判断某个方法上是否存在Transactional注解的。 ​ TransactionInterceptor就是代理逻辑当某个类中存在Transactional注解时到时就产生一个代理对象作为Bean代理对象在执行某个方法时最终就会进入到TransactionInterceptor的invoke()方法。 Spring事务基本执行原理 一个Bean在执行Bean的创建生命周期时会经过InfrastructureAdvisorAutoProxyCreator的初始化后的方法会判断当前当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配匹配逻辑为判断该Bean的类上是否存在Transactional注解或者类中的某个方法上是否存在Transactional注解如果存在则表示该Bean需要进行动态代理产生一个代理对象作为Bean对象。 ​ 该代理对象在执行某个方法时会再次判断当前执行的方法是否和BeanFactoryTransactionAttributeSourceAdvisor匹配如果匹配则执行该Advisor中的TransactionInterceptor的invoke()方法执行基本流程为 利用所配置的PlatformTransactionManager事务管理器新建一个数据库连接修改数据库连接的autocommit为false执行MethodInvocation.proceed()方法简单理解就是执行业务方法其中就会执行sql如果没有抛异常则提交如果抛了异常则回滚 ​ Spring事务详细执行流程 Spring事务执行流程图Spring事务的底层实现流程| ProcessOn免费在线作图,在线流程图,在线思维导图 Spring事务传播机制 在开发过程中经常会出现一个方法调用另外一个方法那么这里就涉及到了多种场景比如a()调用b() a()和b()方法中的所有sql需要在同一个事务中吗a()和b()方法需要单独的事务吗a()需要在事务中执行b()还需要在事务中执行吗等等情况... 所以这就要求Spring事务能支持上面各种场景这就是Spring事务传播机制的由来。那Spring事务传播机制是如何实现的呢? ​ 先来看上述几种场景中的一种情况a()在一个事务中执行调用b()方法时需要新开一个事务执行 ​ 首先代理对象执行a()方法前先利用事务管理器新建一个数据库连接a将数据库连接a的autocommit改为false把数据库连接a设置到ThreadLocal中执行a()方法中的sql执行a()方法过程中调用了b()方法注意用代理对象调用b()方法 代理对象执行b()方法前判断出来了当前线程中已经存在一个数据库连接a了表示当前线程其实已经拥有一个Spring事务了则进行挂起挂起就是把ThreadLocal中的数据库连接a从ThreadLocal中移除并放入一个挂起资源对象中挂起完成后再次利用事务管理器新建一个数据库连接b将数据库连接b的autocommit改为false把数据库连接b设置到ThreadLocal中执行b()方法中的sqlb()方法正常执行完则从ThreadLocal中拿到数据库连接b进行提交提交之后会恢复所挂起的数据库连接a这里的恢复其实只是把在挂起资源对象中所保存的数据库连接a再次设置到ThreadLocal中a()方法正常执行完则从ThreadLocal中拿到数据库连接a进行提交 这个过程中最为核心的是在执行某个方法时判断当前是否已经存在一个事务就是判断当前线程的ThreadLocal中是否存在一个数据库连接对象如果存在则表示已经存在一个事务了。 Spring事务传播机制分类 ​ 其中以非事务方式运行表示以非Spring事务运行表示在执行这个方法时Spring事务管理器不会去建立数据库连接执行sql时由Mybatis或JdbcTemplate自己来建立数据库连接来执行sql。 案例分析 情况1 Component public class UserService {Autowiredprivate UserService userService;Transactionalpublic void test() {// test方法中的sqluserService.a();}Transactionalpublic void a() {// a方法中的sql} }默认情况下传播机制为REQUIRED表示当前如果没有事务则新建一个事务如果有事务则在当前事务中执行。​ 所以上面这种情况的执行流程如下 新建一个数据库连接conn设置conn的autocommit为false执行test方法中的sql执行a方法中的sql执行conn的commit()方法进行提交 情况2 假如是这种情况 Component public class UserService {Autowiredprivate UserService userService;Transactionalpublic void test() {// test方法中的sqluserService.a();int result  100/0;}Transactionalpublic void a() {// a方法中的sql} }所以上面这种情况的执行流程如下 新建一个数据库连接conn设置conn的autocommit为false执行test方法中的sql执行a方法中的sql抛出异常执行conn的rollback()方法进行回滚所以两个方法中的sql都会回滚掉 情况3 假如是这种情况 Component public class UserService {Autowiredprivate UserService userService;Transactionalpublic void test() {// test方法中的sqluserService.a();}Transactionalpublic void a() {// a方法中的sqlint result  100/0;} }所以上面这种情况的执行流程如下 新建一个数据库连接conn设置conn的autocommit为false执行test方法中的sql执行a方法中的sql抛出异常执行conn的rollback()方法进行回滚所以两个方法中的sql都会回滚掉 情况4 如果是这种情况 Component public class UserService {Autowiredprivate UserService userService;Transactionalpublic void test() {// test方法中的sqluserService.a();}Transactional(propagation Propagation.REQUIRES_NEW)public void a() {// a方法中的sqlint result  100/0;} }所以上面这种情况的执行流程如下 新建一个数据库连接conn设置conn的autocommit为false执行test方法中的sql又新建一个数据库连接conn2执行a方法中的sql抛出异常执行conn2的rollback()方法进行回滚继续抛异常对于test()方法而言它会接收到一个异常然后抛出执行conn的rollback()方法进行回滚最终还是两个方法中的sql都回滚了 Spring事务强制回滚 正常情况下a()调用b()方法时如果b()方法抛了异常但是在a()方法捕获了那么a()的事务还是会正常提交的但是有的时候我们捕获异常可能仅仅只是不把异常信息返回给客户端而是为了返回一些更友好的错误信息而这个时候我们还是希望事务能回滚的那这个时候就得告诉Spring把当前事务回滚掉做法就是 Transactional public void test(){// 执行sqltry {b();} catch (Exception e) {// 构造友好的错误信息返回TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}}public void b() throws Exception {throw new Exception(); }TransactionSynchronization Spring事务有可能会提交回滚、挂起、恢复所以Spring事务提供了一种机制可以让程序员来监听当前Spring事务所处于的状态。 ​ Component public class UserService {Autowiredprivate JdbcTemplate jdbcTemplate;Autowiredprivate UserService userService;Transactionalpublic void test(){TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {Overridepublic void suspend() {System.out.println(test被挂起了);}Overridepublic void resume() {System.out.println(test被恢复了);}Overridepublic void beforeCommit(boolean readOnly) {System.out.println(test准备要提交了);}Overridepublic void beforeCompletion() {System.out.println(test准备要提交或回滚了);}Overridepublic void afterCommit() {System.out.println(test提交成功了);}Overridepublic void afterCompletion(int status) {System.out.println(test提交或回滚成功了);}});jdbcTemplate.execute(insert into t1 values(1,1,1,1,1));System.out.println(test);userService.a();}Transactional(propagation Propagation.REQUIRES_NEW)public void a(){TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {Overridepublic void suspend() {System.out.println(a被挂起了);}Overridepublic void resume() {System.out.println(a被恢复了);}Overridepublic void beforeCommit(boolean readOnly) {System.out.println(a准备要提交了);}Overridepublic void beforeCompletion() {System.out.println(a准备要提交或回滚了);}Overridepublic void afterCommit() {System.out.println(a提交成功了);}Overridepublic void afterCompletion(int status) {System.out.println(a提交或回滚成功了);}});jdbcTemplate.execute(insert into t1 values(2,2,2,2,2));System.out.println(a);}}
http://www.hkea.cn/news/14367450/

相关文章:

  • 上海网站建设制作公司如何只做网站
  • 企业网站的制作与维护wordpress视频类模板下载
  • 有什么网站可以做免费推广广西网络推广公司
  • h5自适应网站源码华为外包一般能干多久
  • wordpress 站点打开慢lunix安装wordpress
  • 免备案做网站可以盈利吗开发和研发的区别
  • dede程序数据库还原图文教程★适合dede网站迁移铜陵市建设工程管理局网站
  • 在哪做网站关键词苏州高级网站建设
  • 深圳网站建设哪家强厦门网页设计代做
  • 做电影网站资源哪里来的杭州网站设计询问蓝韵网络
  • 网站怎么做留言提交功能云猎建筑人才网
  • 梅州哪里做网站企业建设网站怎么做账
  • 慈溪企业排名网站中国移动积分兑换商城官方网站
  • 花钱人做的网站做好后算谁的莱芜二手房网
  • 一个域名一个主机可以做两个网站吗如何重新编辑wordpress
  • 餐饮网站建设目标做企业网站价格
  • 入户广州网站做一个购物商城网站多少钱
  • 怎么制作网站logo重庆旅游攻略详细安排
  • 做网站后端用户用什么写郑州装修公司口碑哪家好
  • 教育培训网站建设方案模板中国摄影网站有哪些
  • 做网站做得好的公司有国外的贸易网站
  • 建设网站服务请示wordpress 提高收录
  • 设计网站多少钱用户权限网站
  • 网站关键字如何设置网站建设的主要工作流程
  • 怎样构建网站宁化网站建设
  • 自己做的网站出现左右滑动条做wish选品网站 数据网站
  • 免费ppt模板的网站公司网站设计是不是一次性收费的
  • 免费部署网站公司资质查询官方网站
  • 响应式酒店网站模板网络空间设计方案
  • 做低首付的汽车网站有哪些河北建设银行石家庄分行招聘网站