疫情期间在家重新读了《Spring in Action》,每次翻阅总有一些收获,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识简要总结梳理一下
1、基本概念 |-/ 事务的目的
|-/ 事务特性(ACID)
|-/ 事务的7种传播行为
2、声明式事务
|-/ 配置方式
|-/ 实现原理
3、编程式事务
4、常见问题
|-/ 事务不生效
基本概念
1、事务的目的就是让数据资源所承载的系统状态始终处于'正确'的状态。Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作
2、事务特性(ACID) : 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
3、事务的7种传播行为:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED
其中事务的隔离性4种隔离级别- Read Uncommitted(读取未提交内容)、Read Committed(读取提交内容)、Repeatable Read(可重读)、Serializable(可串行化);在处理事务隔离性的时候通常会遇到脏读、不可重复读、幻读现象
声明事务
1、配置方式-注解元数据驱动的声明式事务(@Transactional)、也可以采用XML元数据驱动的声明式事务
2、实现原理-Spring事务采用AOP的方式实现、PlatformTransactionManager 事务管理器实现
声明事务-XML元数据驱动的声明式事务我们可以采用基于TransactionProxyFactoryBean的配置 或者 基于<tx/>命名空间的配置、也可以基于BeanNameAutoProxyCreator的配置
编程式事务
编程式事务归纳起来具体有这么几种实现方式
1、直接使用PlatformTransactionManager 事务管理器实现来进行编程式事务管理。 2、使用框架底层API(JJDBC,Session)来进行事务控制
3、直接使用TransactionTemplate来进行编程式事务管理,TransactionTemplate的编程式事务管理是使用模板方法设计模式对原始事务管理方式的封装
4、Spring事务保存点savepoint,创建基于SavePoint的嵌套事务来实现编程式事务管理。
常见问题-/事务不生效
1、Bean是否是代理对象;
2、入口函数private 方法, final 方法 和 static 方法数据库是否支持事务(Mysql的MyIsam不支持事务);
3、切点是否配置正确;
4、如果使用了SpringMVC,SpringMVC容器有没有重复扫描;
业务代码是否吞掉异常;
5、Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚;
6、业务和事务入口是否在同一个线程里;
7、service方法中是否直接调用本类中的另一个方法