在Spring中,事务管理是通过AOP(面向切面编程)和代理模式实现的。Spring提供了声明式事务管理,允许开发者通过简单的配置来管理事务,而不需要手动编写事务管理的代码。
概述:
1.Spring事务底层是基于数据库事务和AOP机制的
2.首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean
3.当调用代理对象的方法时,会先判断该方法上是否加了@Transactioral注解
4.如果加了,那么则利用事务管理器创建一个数据库连接
5.并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
6.然后执行当前方法,方法中会执行sql
7.执行完当前方法后,如果没有出现异常就直接提交事务
8.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9.Spring事务的隔离级别对应的就是数据库的隔离级别
10.Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的
11.Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql
详细介绍:
1. **事务管理器(Transaction Manager)**:
- Spring事务管理的核心是事务管理器,它是一个接口,有多个实现类,如`DataSourceTransactionManager`、`JtaTransactionManager`、`HibernateTransactionManager`等。事务管理器负责事务的开始、提交和回滚。2. **事务定义(Transaction Definition)**:
- 事务定义包括事务的传播行为、隔离级别、超时时间、是否只读等属性。这些属性可以通过`@Transactional`注解或XML配置来指定。3. **事务状态(Transaction Status)**:
- 事务状态表示当前事务的状态,如是否是新事务、是否有保存点、是否已完成等。事务管理器使用事务状态来控制事务的执行。4. **AOP代理(AOP Proxy)**:
- Spring使用AOP代理来实现事务管理。当一个方法被标注了`@Transactional`注解时,Spring会为该方法生成一个代理对象。在调用该方法时,实际调用的是代理对象的方法。5. **事务拦截器(TransactionInterceptor)**:
- 事务拦截器是AOP中的一个通知(Advice),它负责在方法调用前后进行事务管理。在方法调用前,事务拦截器会开始一个新事务或加入一个现有事务;在方法调用后,事务拦截器会根据方法的执行结果提交或回滚事务。6. **事务传播行为(Transaction Propagation Behavior)**:
- 事务传播行为定义了事务方法调用时的事务边界。Spring提供了多种传播行为,如`REQUIRED`、`REQUIRES_NEW`、`NESTED`、`SUPPORTS`、`NOT_SUPPORTED`、`NEVER`等。7. **事务回滚规则(Transaction Rollback Rules)**:
- 默认情况下,Spring事务在遇到unchecked异常(如`RuntimeException`及其子类)时会回滚。可以通过`rollbackFor`和`noRollbackFor`属性来指定需要回滚或不回滚的异常类型。
以下是一个简单的示例,展示了如何在Spring中使用`@Transactional`注解进行事务管理:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class MyService {@Autowiredprivate MyRepository myRepository;@Transactionalpublic void performTransaction() {// 业务逻辑myRepository.saveData();// 如果发生异常,事务会回滚throw new RuntimeException("Simulated exception");}
}
在这个示例中,`performTransaction`方法被标注了`@Transactional`注解,这意味着该方法将在事务上下文中执行。如果方法中抛出`RuntimeException`,事务将回滚。
总结来说,Spring事务管理通过AOP代理和事务拦截器实现了声明式事务管理,使得开发者可以简单地通过注解或配置来管理事务,而不需要手动编写复杂的事务管理代码。