🎉🎉欢迎光临,终于等到你啦🎉🎉
🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀
🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀
本专栏带你从Spring入门到入魔
这是苏泽的个人主页可以看到我其他的内容哦👇👇
努力的苏泽http://suzee.blog.csdn.net/
目录
介绍
1.1 Spring 事务管理的重要性
1.2 目标和范围
Spring 事务基础
2.1 事务概述
2.2 事务管理器
2.3 事务定义和注解
事务角色
事务相关配置
事务传播行为
1. REQUIRED 传播行为
2. REQUIRES_NEW 传播行为
3. SUPPORTS 传播行为
4. NOT_SUPPORTED 传播行为
5. MANDATORY 传播行为
6. NEVER 传播行为
编辑
隔离级别
1. READ_UNCOMMITTED 隔离级别
2. READ_COMMITTED 隔离级别
3. REPEATABLE_READ 隔离级别
4. SERIALIZABLE 隔离级别
事务原理
aop/动态代理
事务管理
对于编程式事务管理:
对于声明式事务管理:
实例
TransactionInterceptor 事务拦截处理
1.1 Spring 事务管理的重要性
在应用程序中,事务管理是确保数据的一致性和完整性的重要组成部分。Spring 事务管理提供了一种可靠且灵活的方式来管理事务,确保在数据库操作过程中的原子性、一致性、隔离性和持久性。
Spring 事务管理的重要性包括:
1.2 目标和范围
Spring 事务管理的目标是确保在应用程序中的数据库操作过程中,能够实现以下目标:
Spring 事务管理的范围包括:
2.1 事务概述
Spring 事务是一组数据库操作的逻辑单元,具有原子性和一致性。事务由一系列操作组成,这些操作要么全部成功执行并提交,要么全部失败并回滚。
Spring 事务的关键概念包括:
2.2 事务管理器
在 Spring 中,事务管理器(Transaction Manager)是用于管理事务的关键组件。事务管理器负责事务的开始、提交和回滚操作,并与底层的数据库或持久化框架进行交互。
Spring 提供了多种事务管理器的实现,包括:
你可以根据应用程序所使用的持久化框架选择合适的事务管理器。
2.3 事务定义和注解
在 Spring 中,事务定义(Transaction Definition)用于定义事务的属性,如隔离级别、传播行为、超时设置等。事务定义可以通过编程方式或声明式方式来定义。
编程式事务定义是通过编写代码来显式地管理事务的开始、提交和回滚。你可以使用编程式事务管理的 API(如 TransactionTemplate)来定义事务的属性。
声明式事务定义是通过在方法或类级别上使用注解或 XML 配置来定义事务的属性。Spring 提供了 @Transactional 注解,用于在方法级别上定义事务的属性。你可以在需要进行事务管理的方法上添加 @Transactional 注解,并指定事务的属性。
事务的属性包括传播行为(Propagation)、隔离级别(Isolation)、只读标志(ReadOnly)、超时设置(Timeout)等。通过定义适当的事务属性,你可以控制事务的行为和特性。
例如,下面是一个使用 @Transactional 注解定义事务的例子:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) public void performTransaction() { // 事务操作 }
Spring的事务抽象包括三个主要接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus。
- PlatformTransactionManager负责定义事务的边界,它确定了何时开始和结束一个事务。
- TransactionDefinition负责定义事务的属性,包括隔离级别、传播行为等。它提供了对事务进行详细配置的能力。
- PlatformTransactionManager根据TransactionDefinition的属性定义来开启相关的事务。在事务开始后到结束期间,TransactionStatus负责跟踪和管理事务的状态。通过TransactionStatus,我们可以对事务进行有限的控制。
- 常用的TransactionDefinition的实现包括DefaultTransactionDefinition和TransactionTemplate。这两个主要用于编程式事务场景。另外,还有DefaultTransactionAttribute和RuleBasedTransactionAttribute,它们主要用于基于Spring AOP的声明式事务管理场景。RuleBasedTransactionAttribute允许同时指定多个回滚规则。
- TransactionStatus的一个常见实现是DefaultTransactionStatus,它用于记录事务的状态信息。
- PlatformTransactionManager的实现可以分为面向局部事务和面向全局事务两个分支。常用的面向局部事务的实现包括DataSourceTransactionManager(用于JDBC和MyBatis)和HibernateTransactionManager。它们提供了针对特定持久化框架的事务管理功能。
假设我们有一个银行账户系统,其中涉及两个账户之间的转账操作,需要保证转账操作的原子性,即要么两个账户的金额同时发生变化,要么都不发生变化。
首先,我们需要使用数据库事务来确保转账操作的一致性。假设我们使用Spring框架来管理事务,代码如下所示:
@Transactional public void transferAmount(String fromAccount, String toAccount, double amount) { try { // 1. 查询转出账户的余额 double fromBalance = accountDao.getBalance(fromAccount); // 2. 查询转入账户的余额 double toBalance = accountDao.getBalance(toAccount); // 3. 判断转出账户余额是否足够 if (fromBalance < amount) { throw new InsufficientBalanceException("Insufficient balance in the source account."); } // 4. 扣除转出账户的金额 accountDao.updateBalance(fromAccount, fromBalance - amount); // 5. 增加转入账户的金额 accountDao.updateBalance(toAccount, toBalance + amount); // 6. 提交事务 } catch (Exception e) { // 7. 出现异常,回滚事务 throw new TransferException("Error occurred during the transfer.", e); } }
我们使用@Transactional注解表示该方法需要在事务中执行。在方法内部,我们按照以下步骤进行转账操作:
在第6步之前,如果发生了异常,会跳转到第7步,即异常处理的代码块。在异常处理块中,我们抛出一个自定义的TransferException,并使用throw语句将异常继续抛出。这会触发Spring事务管理器的回滚机制,导致之前的数据库操作被撤销,从而恢复到事务开始之前的状态。
通过事务回滚机制,如果在转账过程中发生异常,例如转出账户余额不足,所有的数据库操作都会被回滚,确保数据的一致性。这样可以避免转账过程中数据发生不一致的情况。
通过 Pointcut 事务切点筛选出来的 Bean,会创建一个代理对象,Bean 内部肯定定义了 @Transactional 注解,如果是类上定义的 @Transactional 注解,每个方法都需要进行事务处理。代理对象的事务拦截处理在 TransactionInterceptor 拦截器中,实现了 MethodInterceptor 方法拦截器,也就是实现了 Object invoke(MethodInvocation invocation) 这个方法,一起来看看 TransactionInterceptor 这个类