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

雄安智能网站建设上海市建设协会网站

雄安智能网站建设,上海市建设协会网站,哪家做网站的,成全视频免费观看在线看小说下载大体上分为两种情况#xff1a;方法上添加了事务注解Transactional 和方法上没有添加事务注解Transactional。 添加了Transactional 注解的在注入 bean 的时候就会被创建代理类#xff0c;在代理类中使用增强逻辑进行事务处理。没有添加Transactional 注解的#xff0c;在 …大体上分为两种情况方法上添加了事务注解Transactional 和方法上没有添加事务注解Transactional。 添加了Transactional 注解的在注入 bean 的时候就会被创建代理类在代理类中使用增强逻辑进行事务处理。没有添加Transactional 注解的在 SqlSession 执行 sql方法的时候执行完sql 后提交事务。 方法上没有事务注解Transactional 我们需要知道大体流程 与Spring 框架集成后的 mybatis 的 SqlSession 会被SqlSessionTemplate代理。即当我们使用 mybatis 执行 sql 的时候必然会走 SqlSessionTemplate 的 invoke 方法在SqlSessionTemplate的 invoke 方法中。会先获取一个 Session 然后在执行被代理的方法执行增删改查的sql。执行完Sql 之后会判断是否有Spring事务如果没有Spring事务就提交。如果有 Spring 事务当前 invoke 方法什么也不做事务交给 Spring 事务管理器来做。 这个时候sql 执行完自动提交。SQL 执行失败就失败。这个时候 sql 的执行会走SqlSession 的代理逻辑 SqlSessionTemplate 中的invoke 方法。 ​​ 方法上有事务注解Transactional 这个时候会用到 Spring 的事务管理器。 当然首先是 AOP 针对Transactional 注解进行代理。在 AOP 的 BeanPostProcessor 扫描Transactional 注解的时候会解析目标类和方法的属性并包装成事务属性对象并对含有 Transactional 注解的类创建动态代理对象。 动态代理对象的增强逻辑或者叫代理逻辑为TransactionInterceptor。 此外我们还需要知道 Mybatis事务和Spring事务的沟通桥梁就是 TransactionSynchronizationManager。TransactionSynchronizationManager会和DataSourceTransactionManager进行交互。 Transactional的代理逻辑 入口是TransactionInterceptor​TransactionInterceptor 本身是个Advisice。是AOP的切面。其切面逻辑主要是调用抽象父类TransactionAspectSupport的invokeWithinTransaction​这个方法以事务的方式调用这个方法。 获取AnnotationTransactionAttributeSource​ 事务属性源。 获取事务属性从事务属性源里获取当前被调用方法的事务属性。 获取事务管理器。根据事务管理器的类型选择对应的逻辑执行。 获取事务唯一标识 joinpointIdentification​ 这个算是事务的唯一key吧。通常是类的全路径名方法名 创建一个事务如果该方法对应的事务属性不为空调用createTransactionIfNecessary​方法。该方法未必会一定创建事务如果事务存在就不会创建事务。 如果事务存在调用getTransaction​获取已存在的事务。并按照事务传播机制进行处理 ​PROPAGATION_NEVER​抛异常​PROPAGATION_NOT_SUPPORTED​挂起当前事务​PROPAGATION_REQUIRES_NEW​挂起当前事务开启一个新的事务。。。 处理事务超时时间 如果没有发现已存在的事务处理传播机制。 startTransaction开始执行事务PROPAGATION_REQUIRED​ doBegin方法中将事务自动提交改为false。 invocation.proceedWithInvocation()执行增强方法环绕通知 如果事务方法执行未发生异常则调用commitTransactionAfterReturning(txInfo)进行提交事务 如果事务方法执行发生异常则调用completeTransactionAfterThrowing(txInfo, ex)进行异常回滚 Mybatis -TransactionSynchronizationManager Mybatis事务和Spring事务的沟通桥梁就是 TransactionSynchronizationManager。TransactionSynchronizationManager会和DataSourceTransactionManager进行交互。 我们先看一下mybatis是如何和TransactionSynchronizationManager对接的。一切都在SqlSessionTemplate这个类的反射逻辑中。 SqlSessionTemplate SqlSessionTemplate禁用掉了手动事务操作。 public void commit(boolean force) {throw new UnsupportedOperationException(Manual commit is not allowed over a Spring managed SqlSession); }public void rollback() {throw new UnsupportedOperationException(Manual rollback is not allowed over a Spring managed SqlSession); }获取sqlSession的逻辑 在MybatisAutoConfiguration中创建了SqlSessionTemplate代理DefaultSqlSession以实现DefaultSqlSession的复用。 SqlSessionTemplate是SqlSession的实现之一。其目的主要是适应Spring的容器化环境和Spring 事务。 在SqlSessionTemplate的代理逻辑中会有获取 SqlSession的逻辑。这里会优先从TransactionSynchronizationManager获取一个SqlSession。如果获取不到再创建一个并注册到TransactionSynchronizationManager中。下次直接用就可以。 public static SqlSession getSqlSession(SqlSessionFactory sessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {Assert.notNull(sessionFactory, No SqlSessionFactory specified);Assert.notNull(executorType, No ExecutorType specified);SqlSessionHolder holder (SqlSessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);SqlSession session sessionHolder(executorType, holder);if (session ! null) {return session;} else {LOGGER.debug(() - {return Creating a new SqlSession;});session sessionFactory.openSession(executorType);registerSessionHolder(sessionFactory, executorType, exceptionTranslator, session);return session;} }判断sqlSession是否支持事务 public static boolean isSqlSessionTransactional(SqlSession session, SqlSessionFactory sessionFactory) {Assert.notNull(session, No SqlSession specified);Assert.notNull(sessionFactory, No SqlSessionFactory specified);SqlSessionHolder holder (SqlSessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);return holder ! null holder.getSqlSession() session; }DataSourceTransactionManager - TransactionSynchronizationManager DataSourceTransactionManager 是Spring事务中事务管理器​PlatformTransactionManager​的一种实现。 PlatformTransactionManager有三个方法分别是getTransaction、commit、rollback。由于getTransaction最为简洁直观所以我们单看这个类就可以。 protected Object doGetTransaction() {DataSourceTransactionObject txObject new DataSourceTransactionObject();txObject.setSavepointAllowed(isNestedTransactionAllowed());ConnectionHolder conHolder (ConnectionHolder) TransactionSynchronizationManager.getResource(obtainDataSource());txObject.setConnectionHolder(conHolder, false);return txObject; }
http://www.zqtcl.cn/news/571566/

相关文章:

  • 做网站接单的网站做外贸网站价位
  • 金融商城快捷申请网站模板下载汕头网站建设和运营
  • 网站建设网站备案所需资料请兼职做企业网站设计怎么收费
  • 电脑配件经营网站的建设论文邯郸市环保局网站建设项目环境
  • 那些网站可以做反链免费游戏不用登录直接玩
  • 安徽网站建设的基本步骤接外贸订单的平台
  • 那些网站可以找得到做货代的广东企业微信网站开发
  • 海宁市建设局官方网站6哔哩哔哩网页版官网在线观看
  • 泉州网站建设轩奇网讯韩国美容网站模板
  • 培训好吗网站建设wordpress手游
  • 元典科技网站建设网页设计制作图片页面
  • 网站设置什么意思无代码搭建平台
  • 织梦做的网站后台登录做网站购买域名
  • 哈尔滨网站关键词优化排名合江做网站
  • 手机网站自动适配旅游网络营销方案
  • 敦化网站开发黔东南购物网站开发设计
  • 建设一个网站 需要提供什么如何免费推广自己的网站
  • 佛山企业网站制作公司中国互联网企业100强榜单
  • 买了域名就可以做网站怎么创造游戏软件
  • 广东广州电脑个人建站徐州网站排名公司
  • 网站优化 流量做网站对企业有什么好处
  • 建设机械网站制作人工智能工程师月薪多少
  • wordpress 百度站长沈阳app开发公司哪家好
  • 做网站平台公司网站建设硬件环境
  • 可视化编辑建站平台新密市城乡建设局网站
  • 电子商务的网站的建设内容wordpress主题 微软
  • 什么软件可以做动画视频网站网站的按钮怎么做 视频
  • 饰品做商城网站模式17网站一起做网店新塘
  • 微信做的地方门户网站做设计的平台
  • 旅游网站建设国内外现状安卓开发软件安装教程