Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发人员的工作量。
事务管理的核心接口
spring-tx-5.2.8.RELEAS依赖包的3个接口
- PlatformTransactionManager接口:可以根据属性管理事务。
- TransactionDefinition接口:用于定义事务的属性。
- TransactionStatus接口:用于界定事务的状态 。
PlatformTransactionManager接口
PlatformTransactionManager 接口主要用于管理事务,该接口中提供了三个管理事物的方法。
方法 | 说明 |
---|---|
TransactionStatus | 用于获取事务状态信息 |
void commit(TransactionStatus status) | 用于提交事务 |
void rollback(TransactionStatus status) | 用于回滚事务 |
TransactionDefinition接口
TransactionDefinition接口中定义了事务描述相关的常量,其中包括了事务的隔离级别、事务的传播行为、事务的超时时间和是否为只读事务。
- 事务的隔离级别
隔离级别 | 说明 |
---|---|
ISOLATION_DEFAULT | 采用当前数据库默认的事务隔离级别。 |
ISOLATION_READ_UNCOMMITTED | 读未提交。允许另外一个事务读取到当前未提交的数据,隔离级别最低,可能会导致脏读、幻读或不可重复读。 |
ISOLATION_READ_COMMITTED | 用读已提交。被一个事务修改的数据提交后才能被另一个事务读取,可以避免脏读,无法避免幻读,而且不可重复读。 |
ISOLATION_ REPEATABLE_READ | 允许重复读,可以避免脏读,资源消耗上升。这是MySQL数据库的默认隔离级别 |
REPEATABLE_SERIALIZABLE | 事务串行执行,也就是按照时间顺序一一执行多个事务,不存在并发问题,最可靠,但性能与效率最低。 |
- 事务的传播行为
事务的传播行为是指处于不同事务中的方法在相互调用时,方法执行期间,事务的维护情况。例如,当一个事务的方法B调用另一个事务的方法A时,可以规定A方法继续在B方法所属的现有事务中运行,也可以规定A方法开启一个新事务,在新事务中运行,B方法所属的现有事务先挂起,等A方法的新事务执行完毕后再恢复。
隔离级别 | 说明 |
---|---|
PROPAGATION_REQUIRED | 默认的事务传播行为。如果当前存在一个事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 |
PROPAGATION_SUPPORTS | 读未提交。允许如果当前存在一个事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 |
PROPAGATION_MANDATORY | 当前必须存在一个事务,如果没有,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 创建一个新的事务,如果当前已存在一个事务,将已存在的事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 不支持事务,在没有事务的情况下执行,如果当前已存在一个事务,则将已存在的事务挂起。 |
ROPAGATION_NEVER | 永远不支持当前事务,如果当前已存在一个事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在当前事务的一个子事务中执行。 |
- 事务的超时时间
事务的超时时间是指事务执行的时间界限,超过这个时间界限,事务将会回滚。TransactionDefinition接口提供了TIMEOUT_DEFAULT常量定义事务的超时时间。
- 事务是否只读
当事务为只读时,该事务不修改任何数据,只读事务有助于提升性能,如果在只读事务中修改数据,会引发异常。
TransactionDefinition接口中除了提供事务的隔离级别、事务的传播行为、事务的超时时间和是否为只读事务的常量外,还提供了一系列方法来获取事务的属性。
方法 | 说明 |
---|---|
int getPropagationBehavior() | 返回事务的传播行为 |
int getIsolationLevel() | 返回事务的隔离层次 |
int getTimeout() | 返回事务的超时属性 |
boolean isReadOnly() | 判断事务是否为只读 |
String getName() | 返回定义的事务名称 |
TransactionStatus接口
方法 | 说明 |
---|---|
boolean isNewTransaction() | 判断当前事务是否为新事务 |
boolean hasSavepoint() | 判断当前事务是否创建了一个保存点 |
boolean isRollbackOnly() | 返判断当前事务是否被标记为rollback-only |
void setRollbackOnly() | 将当前事务标记为rollback-only |
boolean isCompleted() | 返判断当前事务是否已经完成(提交或回滚) |
void flush() | 刷新底层的修改到数据库 |
Spring中的事务管理的两种方式
Spring中的事务管理分为两种方式,一种是传统的编程式事务管理,另一种是声明式事务管理。
-
编程式事务管理:通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。
-
声明式事务管理:通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码植入到业务目标类中。
谢谢浏览!