12.Spring事务管理概述

1 事务管理的核心接口

在spring-tx-5.3.12.jar包中,Spring提供了用于事务管理的依赖包,在包org.springframework.transaction中有三个接口文件:PlatformTransactionManager、TransactionDefinition、TransactionStatus。

1.1 PlatformTransactionManager

PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

package org.springframework.transaction;
import org.springframework.lang.Nullable;
public interface PlatformTransactionManager extends TransactionManager {

	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;
			
	void commit(TransactionStatus status) throws TransactionException;
	
	void rollback(TransactionStatus status) throws TransactionException;

}

方法说明
TransactionStatus getTransaction(TransactionDefination defination)获取事务的状态信息
void commit(TransactionStatus status)提交事务
void rollback(TransactionStatus status)回滚事务

注意
PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类;

  • org.springframework.jdbc.datasource.DataSourceTransactionManager:用于JDBC或者MyBatis的事务管理。
  • org.springframework.orm.hibernate5.HibernateTransactionManager:用于Hibernate的技术管理。
  • org.springframwork.transaction.jta.JtaTransactionManager:用于配置全局事务管理。

1.2 TransactionDefinition

TransactionDefinition 是事务的定义信息对象,该对象定义了事务规则,并提供了获取事务相关信息的方法:

package org.springframework.transaction;

import org.springframework.lang.Nullable;
//事务的定义信息
public interface TransactionDefinition {

	int PROPAGATION_REQUIRED = 0;
	int PROPAGATION_SUPPORTS = 1;
	int PROPAGATION_MANDATORY = 2;
	int PROPAGATION_REQUIRES_NEW = 3;
	int PROPAGATION_NOT_SUPPORTED = 4;
	int PROPAGATION_NEVER = 5;
	int PROPAGATION_NESTED = 6;

	int ISOLATION_DEFAULT = -1;
	int ISOLATION_READ_UNCOMMITTED = 1; 
	int ISOLATION_READ_COMMITTED = 2; 
	int ISOLATION_REPEATABLE_READ = 4;  
	int ISOLATION_SERIALIZABLE = 8; 
	
	int TIMEOUT_DEFAULT = -1;


	default int getPropagationBehavior() {
		return PROPAGATION_REQUIRED;
	}

	default int getIsolationLevel() {
		return ISOLATION_DEFAULT;
	}

	default int getTimeout() {
		return TIMEOUT_DEFAULT;
	}

	default boolean isReadOnly() {
		return false;
	}

	@Nullable
	default String getName() {
		return null;
	}

	static TransactionDefinition withDefaults() {
		return StaticTransactionDefinition.INSTANCE;
	}

}

方法说明
String getName()获取事务对象的名称
int getIsolationLevel()获得事务的隔离级别
int getPropogationBehavior()获得事务的传播行为
int getTimeout()获得超时时间
boolean isReadOnly()是否只读

1.事务隔离级别
事务的四大特性:原子性、一致性、隔离性、持久性。

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

  • ISOLATION_DEFAULT
  • ISOLATION_READ_UNCOMMITTED Read uncommitted(读未提交)
  • ISOLATION_READ_COMMITTED Read committed(读提交)
  • ISOLATION_REPEATABLE_READ Repeatable read(可重复读取)
  • ISOLATION_SERIALIZABLE Serializable(可序化)

2.事务传播行为
事物的传播行为是指在同i一个方法中,不同操作前后所使用的事务。传播行为如下所示:
事务传播行为
在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务。通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED。

1.3 TransactionStatus

TransactionStatus接口是事务的状态,描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:

  • void flush():刷新事务。
  • boolean hasSavepoint():获取是否存在保存点。
  • boolean isCompleted():获取事务是否完成。
  • boolean isNewTransaction():获取是否是新事务。
  • boolean isRollbackOnly():获取是否回滚。
  • void setRollbackOnly():设置事务回滚。

2 事务管理的方式

Spring的事务管理分为两种方式:一种是传统的编程式事务管理,一种是声明式事务管理。

  • 编程式事务管理
    通过编写代码来实现事务的管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。

  • 声明式事务管理
    通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个”切面“代码单独编写,然后通过AOP技术将事务管理的切面代码织入业务目标代码中去。

声明式事务管理最大的优点在于无需通过编程的方式来管理事务,只需要在配置文件中进行相关的事务规则声明,就可以将事务规则运用到业务逻辑中去。这样的话在开发中,更加专注于核心业务代码的编写,在一定程度上减少了工作量,提高了开发效率。所以在实际开发中,通常推荐使用声明式事务管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luo_xguan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值