Spring的事务原理分析、与mysql的事务关系
spring事务?mysql事务?
系统中到底谁的事务是在保证数据的一致性,两个事务有什么关系?
spring事务的基本原理
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的; Spring的事务管理一般使用声明式事务,在相关的类和方法上通过注解@Transactional标识,这是一个基于AOP的实现操作; 而真正的数据库层的事务提交和回滚是通过mysql的日志文件binlog或者redo log实现的。
Spring事务的配置方式
Spring支持编程式事务管理以及声明式事务管理两种方式
1.编程式事务管理 编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate。 2.声明式事务管理 声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。 编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现,只需要在配置文件中做相关的事务规则声明或者通过注解的方式,便可以将事务规则应用到业务逻辑中。 显然声明式事务管理要优于编程式事务管理,这正是Spring倡导的非侵入式的编程方式。唯一不足的地方就是声明式事务管理的粒度是方法级别,而编程式事务管理是可以到代码块的,但是可以通过提取方法的方式完成声明式事务管理的配置。
Spring 事务的传播属性
所谓spring事务的传播属性(Propagation),就是定义在存在多个事务同时存在的时候,spring应该如何处理这些事务的行为,具体常量的解释见下表:
Spring事务隔离级别
spring的事务隔离级别一般使用默认的DEFAULT,与数据库保持一致;
spring事务并发引发的问题与mysql事务并发问题一样,因此,mysql的事务是针对单次命令操作,spring是在mysql的基础上,对逻辑代码多次操作数据库集合的封装,保证业务的完整性和准确性。
关于具体的事务特性、并发引发的问题及解决方案,可参考往期文章:mysql的事务
