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

泸州工投建设集团有限公司网站漯河建设企业网站

泸州工投建设集团有限公司网站,漯河建设企业网站,跨境电商平台有哪些app,深圳私人网站优化什么是事务? 事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。 Spring 中的事务是怎么实现的? Spring事务底层是基于数据库事务和AOP机制的首先对于…

什么是事务?

事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

Spring 中的事务是怎么实现的?

  • Spring事务底层是基于数据库事务和AOP机制的
  • 首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean
  • 当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解
  • 如果加了,那么则利用事务管理器创建一个数据库连接
  • 并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
  • 然后执行当前方法,方法中会执行sql
  • 执行完当前方法后,如果没有出现异常就直接提交事务
  • 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
  • Spring事务的隔离级别对应的就是数据库的隔离级别
  • Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的
  • Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql
    在这里插入图片描述

如何理解Spring事务的传播机制的?

在这里插入图片描述

一个线程在运行过程中,可能会连续调用好几个方法,在调用某一个方法时,可能就开启了一个Spring事务,那么在调用接下来的方法时,到底是共用同一个事务呢?还是新开一个事务呢?这就是传播机制,程序员可以根据不同的业务场景进行配置,比如:

  • REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
  • SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行
  • MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。
  • REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务。
  • NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务
  • NEVER:不使用事务,如果当前事务存在,则抛出异常
  • NESTED:如果当前事务存在,则在嵌套事务中执行,否则和REQUIRED的操作一样(开启一个事务)

Spring 是如何实现事务的?

在Spring中,一个Spring事务就是对应一个数据库连接,新开一个Spring事务其实就是新开一个数据库连接,比如执行某个方法时需要开启一个Spring事务,那么就会创建一个数据库连接,然后开始执行方法,如果方法中调用了其他方法,此时就会看这个其他方法怎么配置的:

  • 比如是REQUIRES_NEW,那么就会新开一个数据库连接,这个其中方法中的sql就会在这个新开的数据库连接中执行
  • 比如是REQUIRED,那么就不会新开,而是基于之前的数据库连接来执行方法中的sql

那种情况会导致事务失效?

  • 方法内的自调用:Spring事务是基于AOP的,只要使用代理对象调用某个方法时,Spring事务才能生效,而在一个方法中调用使用this.xxx()调用方法时,this并不是代理对象,所以会导致事务失效。
    • 解放办法1:把调用方法拆分到另外一个Bean中
    • 解决办法2:自己注入自己
    • 解决办法3:AopContext.currentProxy()+@EnableAspectJAutoProxy(exposeProxy = true)
  • 方法是被 private 修饰的,Spring事务会基于CGLIB来进行AOP,而CGLIB会基于父子类来失效,子类是代理类,父类是被代理类,如果父类中的某个方法是private的,那么子类就没有办法重写它,也就没有办法额外增加Spring事务的逻辑
  • 方法是final的:原因和private是一样的,也是由于子类不能重写父类中的final的方法

tip: 这种说法有待考察 建议不要回答这个

  • 单独的线程调用方法:当Mybatis或JdbcTemplate执行SQL时,会从ThreadLocal中去获取数据库连接对象,如果开启事务的线程和执行SQL的线程是同一个,那么就能拿到数据库连接对象,如果不是同一个线程,那就拿到不到数据库连接对象,这样,Mybatis或JdbcTemplate就会自己去新建一个数据库连接用来执行SQL,此数据库连接的autocommit为true,那么执行完SQL就会提交,后续再抛异常也就不能再回滚之前已经提交了的SQL了
  • 没加@Configuration注解:如果用SpringBoot基本没有这个问题,但是如果用的Spring,那么可能会有这个问题,这个问题的原因其实也是由于Mybatis或JdbcTemplate会从ThreadLocal中去获取数据库连接,但是ThreadLocal中存储的是一个MAP,MAP的key为DataSource对象,value为连接对象,而如果我们没有在AppConfig上添加@Configuration注解的话,会导致MAP中存的DataSource对象和Mybatis和JdbcTemplate中的DataSource对象不相等,从而也拿不到数据库连接,导致自己去创建数据库连接了
  • 异常被吃掉:如果Spring事务没有捕获到异常,那么也就不会回滚了,默认情况下Spring会捕获RuntimeException和Error
  • 类没有被 Spring 管理
  • 数据库不支持事务

小总结,事务的传播机制这里被问到还是挺多的,所以可以重点看

http://www.dtcms.com/wzjs/822575.html

相关文章:

  • 艺术视频手机网站可以做吗以你的心诠释我的爱网页设计素材
  • 如何向百度提交站点收录信息北京科技公司名单
  • 南京网站维护公司有哪些织梦网站必须下载地址
  • h5制作软件包括网站建设关键词优化
  • 河北廊坊做网站网站建设需求量大
  • 安徽省和城乡建设厅网站广州优化防控措施
  • 优秀网站设计作品邯郸市都有哪些网络推广公司
  • wap网站如何制作做汽配的网站
  • 网站开发人员职责做一套网站开发多少钱
  • 网站的例子推广引流渠道方法大全
  • 广州建设工程网5年网站seo优化公司
  • 170个可带链接锚文本外链的网站论坛WordPress搜狗不收录
  • 免费发布信息网网站网站建设计划书范本
  • 商业设计网站推荐编辑网站的软件
  • 常州本地网站设置网站域名
  • seo如何做网站建设装饰工程合同范本
  • word文档做网站培训怎么样网页设计
  • 一个做礼品的网站购买软件平台
  • 网站开发常用的语言和工具优易网络公司员工发展
  • 嘉鱼网站建设哪家好wordpress教程cms
  • 二手房网站怎么做手游传奇发布网站
  • html5手机网站开发实例wordpress 传值
  • 贵阳网站设计阳光创信好吗网络营销策划推广
  • 做网站电信运营许可证电脑上制作ppt的步骤
  • 手机网站怎么改成电脑版wordpress在哪里下载
  • 交易平台网站制作适合seo软件
  • 仿照别人的网站做违法吗wordpress 电子书插件
  • 网站如何做水晶按钮晋江文学城官网
  • 做标书的专业网站最新在线代理服务器
  • 建筑工程网站源码移动app网站模板