Spring事务管理

一、事务的4大特性:

  原子性、一致性、隔离性、持久性,简称为 ACID 特性

二、事务的管理方式:

1、编程式事务管理 :编程式事务管理是通过编写代码实现的事务管理。可以根据需求规定事务从哪里开始,到哪里结束,拥有很高的灵活性。但是这种方式,会使业务代码与事务规则高度耦合,难以维护,因此我们很少使用这种方式对事务进行管理。所以,本文给大家介绍的是如何使用声明式事务管理。

2、声明式: 声明式事务管理可以通过 2 种方式实现,分别是 XML和注解方式。Spring 在进行声明式事务管理时,底层使用了 AOP 。

三、事务管理器

Spring 提供了一个 PlatformTransactionManager 接口,这个接口被称为 Spring 的事务管理器。这个接口针对不同的框架提供了不同的实现类

实现类 说明
org.springframework.jdbc.datasource.DataSourceTransactionManager 提供给 Spring JDBC 、MBatis 的事务管理器
org.springframework.orm.hibernate5.HibernateTransactionManager 提供给 Hibernate 的事务管理器

这些实现类,需要导入对应的依赖才能看到。 该接口中还有两个对象,分别是 TransactionDefinition 和 TransactionStatus

四、TransactionDefinition

  事务定义,定义了事务的名称,传播属性,事务隔离级别,是否只读,超时时间。

五、TransactionStatus

  事务状态,保存了事务执行过程中的状态。

六、事务的传播行为

  定义: 多个事务之间方法在调用时,这个过程中事务应该如何进行管理。事务A方法在调用事务B方法时,B事务是在A方法中执行呢还是单独另开一个事务,这个是有被调用这B的事务的传播行为决定的。

       分类:7种传播行为

行为 说明
REQUIRED 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行;如果当前没有事务,则以非事务的方式运行。
MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW 当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起
NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED 如果当前存在事务,则创建一个新事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED。

根据上面的描述,我们可以将行为分为三大类。

  • 不要事务:NEVER、NOT_SUPPORTED。
  • 如果有则用:SUPPORTS
  • 必须使用事务:REQUIRED、REQUIRES_NEW、NESTED、MANDATORY

 

posted @ 2022-08-01 23:23  许君闲乘悦  阅读(329)  评论(0编辑  收藏  举报