Spring事务
有关事务的介绍和事务的特性之前以及看过了,但是那是在数据库层面,在Spring中提供了接口来实现事务
1.Spring事务管理的核心接口
上面的PlatformTransactionManager, TransactionDefinition, TransactionStatus就是Spring事务管理的三个顶级接口
2.PlatformTransactionManager事务管理器
Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,如上图所示,Spring并不 直接管理事务,通过这个接口,Spring为各个平台提供了对应的事务管理器,也就是将事务管理的职责委托给其他持久化的相关平台,PlatformTransactionManager中有三个方法:
- 1.TransactionStatus getTransaction(@Nullable TransactionDefinition var1) : 事务管理器通过TransactionDefinition, 获得事务"状态",从而管理事务
- 2.void commit(TransactionStatus status) : 根据状态提交事务
- 3.void rollback(TransactionStatus status) : 根据状态回滚事务
3.Transaction事务状态
- isNewTransaction() : 是否是新的事务
- hasSavepoint() : 是否有保存点
- setRollbackOnly() : 设置回滚
- isRollbackOnly() : 是否回滚
- flush() : 刷新
- isCompleted() : 是否完成
这个接口描述的是一些处理事务提供简单的控制事务执行和查询事务状态方法,在回滚或提交的时候需要应用对应的事务状态
4.TransactionDefinition
翻译过来是事务定义,可以理解为事务的一些基本配置,描述了事务策略如何应用到方法上.包含五个方面
PROPAGATION : 传播行为,当事务方法被另一个事务方法调用时,必须指定事务应该如何传播
- PROPAGATION_REQUIRED : required,必须,默认值. A如果有事务,B将加入到该事务中;若A没有 事务 ,则新建一个事务
- PROPAGATION_SUPPORTS : supports,支持.如果A有事务,B将加入到该事务中;如果A没有事务,B将以非事务执行
- PROPAGATION_MANDATORY : mandatory,强制,A如果有事务,B加入到该事务中;如果A没有事务,B将抛异常
- PROPAGATION_REQUIRES_NEW : requires_new,必须新的.如果A有事务,将A的事务挂起,B创建一个新的事务;如果A没有事务,B创建一个新的事务
- PROPAGATION_NOT_SUPPORTED : not_supported ,不支持, 如果A有事务,则将A的事务挂起,B以非事务执行;如果A没有事务,B将以非事务执行
- PROPAGATION_NEVER : never,从不, 如果A有事务,B将抛异常;如果A没有 事务,B将以非事务执行
- PROPAGATION_NESTED : nested, 嵌套.A和B底层采用保存点机制,形成嵌套事务
ISOLATION : 隔离级别
- 有关隔离级别的内容之前也应提到过了,设置隔离级别就是为了防止数据库并发访问时发生的问题
TIME_OUT : 超时时间
- 为了使应用程序流畅 运行,事务不能运行太长时间. 因为事务可能涉及对后端数据的锁定,所以长时间的事务会不必要的占用数据库资源.事务超时就是一个定时器,在特定时间内事务如果没有执行完毕,就会自动回滚,而不是一直等待其结束
isReadOnly:
- 是否为只读事务,如果事务只对后端的数据库进行读操作,数据库可以利用只读的需求来进行优化,加快处理效率
回滚规则:
- 事务五条属性最后一个就是回滚规则, 这些规则定义了哪些异常会导致事务回滚.默认情况下,事务只有在遇到运行时异常时才会回滚,而在遇到检查型异常不会回滚. 你可以声明十五载遇到特定的检查型异常时像遇到运行期异常那样回滚,同样也可以声明事务遇到特定异常不回滚
5.Spring编程式事务和声明式事务
-
编程式事务处理 : 所谓编程式事务指的是通过编码方式实现事务, 允许用户在代码中精确定义事务的边界, 类似于JDBC变成实现事务管理. 管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.
-
声明式事务 : 建立在AOP之上, 其本质是对方法进行拦截, 然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法后根据执行情况提交或者回滚事务. 声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在逻辑代码里掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过@Transactional注解的方式),便可以将事务规则应用到业务逻辑中