Spring事务的实现原理

Spring事务原理

Spring框架支持对于事务的管理功能,开发人员使用Spring框架能极大的简化对于数据库事务的管理操作,不必进行手动开启事务,提交事务,回滚事务,就是在配置文件或者项目的启动类配置Spring事务相关的注解驱动,使用@Transaction注解即可,既开启并使用Spring事务管理功能

Spring事务分类

通过Spring管理的事务可以分为逻辑事务和物理事务两大类

  • 逻辑事务:通过指通过Spring等框架管理的事务,这种事务建立在物理事务之上,比物理事务更加抽象
  • 物理事务:通常指的是针对特定数据库的事务

Spring支持两种事务声明式方式,分别是编程式事务和声明式事务

  • 编程式事务:如果系统需要明确事务,并且需要细粒度的控制各个事务的边界,此时建议使用编程式事务
  • 声明式事务:如果系统对事务的控制粒度比较粗糙,则建议使用声明式事务

Spring的事务三大接口

  1. PlatformTransactionManager接口:为Hibernate、Mybatis、JTA等持久化框架提供事务管理器,具体的实现由框架自己实现
  2. TransactionDefinition接口:主要定义和事务相关的方法,表示事务属性的常量等信息。部分事务属性的常量和Propagation枚举类中的事务传播类型相对应
  3. TransactionStatus接口:主要用来存储事务执行的状态,并且定义了一组方法,用于判断或者读取事务的状态信息

Spring事务隔离级别       

Spring中存在5中隔离级别主要为:

  • ISOLATION_DEFAULT:该级别是Spring中默认的事务隔离级别
  • ISOLATION_READ_UNCOMMITTED(读未提交):是Spring中最低的隔离级别,事务A能够读取到事务B未提交的数据,会出现脏读、不可重复读、幻读
  • ISOLATION_READ_COMMITTED(读已提交):可以保证事务A的只有事务提交后事务B才能读取到事务A的数据,会出现不可重复读、幻读
  • ISOLATION_REPEABLE_READ(可重复读):可以保证不会出现脏读和不可重复读的问题,但是会出现幻读的问题
  • ISOLATION_SERIALIZABLE(可串行化):事务只能按照特定的顺序执行,多个事务之间只能按照串行化的顺序执行,这个是最可靠的隔离级别,并发性最差

Spring事务传播机制(7种)

         支持当前事务的事务传播机制:REQUIRED、SUPPORTS、MANDATORY

        不支持当前事务的事务传播机制:REQUIRED_NEW、NOT_SUPPORTS、NEVER

        嵌套事务机制:NESTED

注意点:枚举类Propagation集合@Transaction注解使用,枚举类中定义的事务传播行为类型与TransactionDefinition接口定义的事务传播类型相对应,在使用@Transaction注解时,使用的是Propagation枚举类中的事务传播类型,而不是直接使用TransactionDefinition接口中定义的事务传播类型

  1. REQUIRED事务传播类型:表示当前没有事务,就创建一个事务,如果已经存在一个事务,就加入这个事务,Spring默认的事务传播类型
  2. REQUIRES_NEW事务传播类型:表示当前存在事务,则把当前事务挂起,并重新创建新的事务并执行,直到新的事务提交或者回滚,才会恢复执行原来的事务。原有事务跟新事务互不影响
  3. SUPPORTS事务传播类型:表示支持当前事务,如果当前没有事务,就以非事务的方式执行
  4. MANDATORY:表示支持当前事务,这种事务传播类型具备强制性,当前操作必须存在事务,如果不存在,则抛出异常
  5. NOT_SUPPORTED事务传播类型:表示当前以非事务方式执行,如果当前操作在一个事务中,则把当前事务挂起,直到当前操作完成在恢复事务的执行。
  6. NEVER事务传播类型:表示以非事务的方式执行,如果当前操作存在事务,则抛出异常
  7. NESTED事务传播类型:表示如果当前方法中有一个事务正在运行,则这个方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务进行提交或者回滚,如果没有活动事务,则按照REQUIRED事务传播类型执行

Srping中常用的事务传播类型

        7种事务传播机制类型,日常工作上主要使用只有REQUIRED、NOT_SUPPORTED、REQUIRES_NEW三种

        REQUIRED:Spring中默认的传播机制,适用于大部分场景

        NOT_SUPPORTED:适用于发送提示信息、站内信、短信、邮件等,这类场景要求不影响系统的主体业务逻辑,即使操作失败也不应该对主体逻辑产生影响,不能使主体逻辑的事务回滚

        REQUIRES_NEW:总是创建新的事务执行,适用于不受外层方法事务影响的场景。例如记录日志的操作,不管主体业务逻辑是否已经完成,日志都要记录下来,不能因为主体业务逻辑异常事务回滚导致日志记录不到

Spring 事务失效的场景

  • 数据库不支持事务:Spring事务生效的前提是连接的数据库支持事务,如果底层不支持事务,则Spring的事务肯定会失效,例如Mysql的MyISAM存储引擎
  • 事务方法没有被Spring管理:事务方法所在的类没有加载到Spring IOC容器中,事务方法所在的类没有被Spring管理,则食物会失效
  • 方法没有被public修饰:此时事务也会失效
  • 同一个类中的方法调用:如果同一个类的方法A上添加了事务注解,方法B上添加了事务注解,方法A调用方法B,则方法B的事务会失效
  • 未配置事务管理器:如果在项目中没有配置Spring的事务管理器,即使使用了Spring的事务管理功能,Spring的事务也不会生效
  • 方法的事务传播类型不支持事务:如果内部方法的事务传播为不支持事务传播类型,则内部方法的事务在Spring中会失效
  • 不正确的捕获异常:如果自己把异常给吃了,那将会导致事务的失效
  • 标准错误的异常类型:Spring中默认回滚的事务异常类型为RuntimeException,如果抛出的异常不是RuntimeException 或者其子类,事务将失效
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值