Spring的事务原理分析、与mysql的事务关系

spring事务?mysql事务?

系统中到底谁的事务是在保证数据的一致性,两个事务有什么关系?

spring事务的基本原理

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

Spring的事务管理一般使用声明式事务,在相关的类和方法上通过注解@Transactional标识,这是一个基于AOP的实现操作;

Spring在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务);

而真正的数据库层的事务提交和回滚是通过mysql的日志文件binlog或者redo log实现的。

 Spring事务的配置方式

Spring支持编程式事务管理以及声明式事务管理两种方式

1.编程式事务管理

        编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate。

2.声明式事务管理

       声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
       编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现,只需要在配置文件中做相关的事务规则声明或者通过注解的方式,便可以将事务规则应用到业务逻辑中。
       显然声明式事务管理要优于编程式事务管理,这正是Spring倡导的非侵入式的编程方式。唯一不足的地方就是声明式事务管理的粒度是方法级别,而编程式事务管理是可以到代码块的,但是可以通过提取方法的方式完成声明式事务管理的配置。

 Spring 事务的传播属性

所谓spring事务的传播属性(Propagation),就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为,具体常量的解释见下表:

REQUIRED(默认属性)如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。 
MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。 
NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 
NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 
NESTED 支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 

Spring事务隔离级别

spring的事务隔离级别一般使用默认的DEFAULT,与数据库保持一致;

spring事务并发引发的问题与mysql事务并发问题一样,因此,mysql的事务是针对单次命令操作,spring是在mysql的基础上,对逻辑代码多次操作数据库集合的封装,保证业务的完整性和准确性。

关于具体的事务特性、并发引发的问题及解决方案,可参考往期文章:mysql的事务

mysql的事务原理、隔离机制及解决方案_一朵纯洁的小白花的博客-CSDN博客概述:事务(Transaction),是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。事务的特征(ACID)又称基本要素:原子性(Atomicity):将所有 SQL 作为原子工作单元执行,要么全部执行,要么全部不执行一致性(Consistency):事务完成后,所有数据的状态都是一致的隔离性(Isolation):如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离持久https://blog.csdn.net/TurboAnho/article/details/121963050?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值