Spring的事务管理
Spring给我们提供了两种编写事务方式,一种是编程式事务,另一只是声明式事务
PlatformTransactionManager:平台事务管理器
平台事务管理器:是一个接口,是Spring用于管理事务的真正对象,并且会根据用户使用的数据库框架不同而切换底层实现。
- DataSourceTransactionManager:底层使用 JDBC 管理事务
- HibernateTransactionManager :底层使用 Hibernate 管理事务
TransactionDefinition:事务定义信息
- 事务定义:用于定义事务的相关信息,隔离级别、超时信息、传播行为、是否只读
TranscationStatus:事务的状态
- 事务状态:用于记录在事务管理中,事务的状态的对象。
事务管理的API之间的关系
Spring进行事务管理的时候,首先,平台事务管理器根据事务定义信息进行事务的管理,在事务管理的过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
Spring事务的传播行为
在实际开发中,如果遇到了特别复杂的业务逻辑,有可能会出现业务层之间的方法互相调用。
事务的传播行为主要用来解决业务层方法相互调用的问题
Spring中提供了七种事务传播行为,共分为三类:
假设在业务层中,有A,B两个方法,这两个方法存在互相调用,可能是A调B,也可能是B调A。
-
保证多个操作在同一个事务中
-
PROPAGATION_REQUIRED(默认值):
如果A方法中有事务,B方法调用A方法,那么使用A方法中的事务,将B方法的操作也包含进A事务中来。 如果A方法中没有事务,那么将创建一个新的事务,将A和B的操作一起包含进来。 保证两个方法的操作总是处于同一个事务中。
-
PROPAGATION_SUPPORTS:支持事务
如果A中有事务,使用A中的事务。如果A没有事务,则不使用事务了。
-
PROPAGATION_MANDATORY:不支持事务
如果A中有事务,使用A中的事务。如果A没有事务,抛出异常,不执行了。
-
-
保证多个操作不在同一个事务中(B调用A)
-
PROPAGATION_REQUIRES_NEW:
如果A中有事务,将A的(暂停),创建新事物,只包含自身(B)操作。 如果A中没有事务,创建一个新事物,包含自身操作(B)。 保证两个方法的操作,总是不在同一个事务中。
-
PROPAGATION_NOT_SUPPORTED:
如果A中有事务,将A的事务挂起,不使用事务管理了,直接执行操作。
-
PROPAGATION_NEVER:
如果A中有事务,将抛出异常
-
-
嵌套式事务
-
PROPAGATION_NESTED:嵌套事务
如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点(存档)。 然后执行B中的操作,如果没有异常,执行通过。 如果有异常,可以选择回滚到最初始的位置,也可以回滚到保存点。 按照事务的顺序进行依次操作,并且为先执行完成的事务记录一个保存点。
-