• Spring事务的实现方式和实现原理


    Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现,数据库事务的提交和回滚是通过binlog或者undolog实现的。Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。

    (1)Spring事务的种类:

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

    ①编程式事务管理使用TransactionTemplate。

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

    声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。

    (2)spring的事务传播机制:

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

    ① PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。

    ② PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。

    ③ PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。‘

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

    ⑤ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。

    ⑥ PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。

    ⑦ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

    (3)Spring中的隔离级别:

    ①ISOLATION_DEFAULT:这是个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

    ②ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。

    ③ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。

    ④ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。

    ⑤ISOLATION_SERIALIZABLE:所有事务逐个依次执行。

  • 相关阅读:
    结构型模式-装饰模式
    谣言检测——《社会网络谣言检测综述》
    AWS Lambda – 函数版本,别名,API网关,CodeDeploy协同
    VSCode提交本地文件到Github远程仓库详细教程
    windows PC virtualBox 配置
    我要涨知识——TypeScript 经典高频面试题(一)
    MyBatis插件原理探究和自定义插件实现
    【强化学习】Sarsa算法求解悬崖行走问题 + Python代码实战
    15款好用的web开源安全测试工具等你来
    Apache commons-dbutils工具简介说明
  • 原文地址:https://blog.csdn.net/m0_67392126/article/details/126516488