Spring 事务原理

Spring 事务原理

一、概述

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。

Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现,数据库事务的提交和回滚是通过 redo log 和 undo log实现的,具体可以看我之前写的Mysql事务原理

Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。

Spring 事务什么时候会失效?

Spring 事务的原理是AOP,进行切面增强,那么失效的根本原因是AOP不起作用,情况有如下几种:

  • 发生自调用:类里面使用this对象调用本类的方法,此时this对象不是代理对象,解决方法:让this 变成代理对象
  • 方法不是public的:@Transactional 只能用于public方法,如果是非public方法,可以开始aspectJ代理模式
  • 数据库不支持事务
  • 没有被spring管理
  • 异常被吃掉,事务不会回滚或者抛出的异常没有被定义,默认为RuntimeException

二、Spring事务的种类

spring支持编程式事务管理和声明式事务管理两种方式:

  • 编程式事务管理使用TransactionTemplate。
  • 声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。

唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。

三、Spring中的隔离级别(就是数据库的隔离级别)

  1. ISOLATION_DEFAULT:这是个 PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
  2. ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。
  3. ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。
  4. ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。
  5. ISOLATION_SERIALIZABLE:所有事务逐个依次执行。

四、spring的事务传播机制

spring事务的传播机制说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。事务传播机制实际上是使用简单的ThreadLocal实现的,所以,如果调用的方法是在新线程调用的,事务传播实际上是会失效的。

  1. PROPAGATION_REQUIRED:(默认传播行为)如果当前不存在事务,就创建一个新事务;如果当前存在事务,就加入该事务。
  2. PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。
  3. PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
  4. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  5. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
  6. PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
  7. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常

总结:

如果当前存在事务

  • 如果当前存在事务,就加入该事务,如果当前不存在事务

    • 就创建一个新事务:PROPAGATION_REQUIRED
    • 就以非事务执行:PROPAGATION_SUPPORTS
    • 就抛出异常:PROPAGATION_MANDATORY
    • 则按REQUIRED属性执行:PROPAGATION_NESTED
  • 如果当前存在事务

    • 就创建新事务进行执行:PROPAGATION_REQUIRES_NEW
  • 如果当前存在事务

    • 就把当前事务挂起,以非事务方式执行操作:PROPAGATION_NOT_SUPPORTED
  • 如果当前存在事务

    • 则抛出异常:PROPAGATION_NEVER
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事务原理是通过AOP(面向切面编程)和代理模式来实现的。Spring使用了动态代理技术,将事务管理逻辑织入到目标方法中,从而实现对事务的控制。 具体来说,Spring事务原理包括以下几个关键点: 1. 事务管理器(Transaction Manager):Spring通过事务管理器来管理事务的提交、回滚和连接的关闭等操作。事务管理器可以是JDBC事务管理器、Hibernate事务管理器或者JTA事务管理器等。 2. 事务定义(Transaction Definition):事务定义包括事务隔离级别、传播行为、超时时间等属性。通过事务定义,我们可以指定事务的一些行为特性。 3. 事务切面(Transaction Aspect):Spring使用AOP来实现事务的切面,将事务管理逻辑织入到目标方法中。在方法执行前后,事务切面会根据事务定义来决定是否开启、提交或回滚事务。 4. 事务通知(Transaction Advice):事务通知是事务切面的具体实现,它定义了在目标方法执行前后需要执行的逻辑。在事务通知中,可以通过事务管理器来控制事务的提交、回滚等操作。 5. 事务代理(Transaction Proxy):Spring使用动态代理技术来生成事务代理对象。事务代理对象包装了目标对象,并在目标方法执行前后调用事务通知。 通过以上几个关键点的组合,Spring实现了对事务的管理和控制。当我们在业务方法上添加@Transactional注解时,Spring会根据注解的配置来生成事务代理对象,并在方法执行前后执行事务通知,从而实现对事务的管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值