事务的概念
事务是指一组操作,这些操作要么全部执行成功,要么全部失败回滚。在数据库中,事务是指一组 SQL 语句,这些语句要么全部执行成功,要么全部失败回滚。
Spring 事务的概念
Spring 事务是指在 Spring 框架中对事务进行管理的机制。Spring 事务管理器可以管理多种事务,包括 JDBC、Hibernate、JPA、JTA 等。
Spring 事务具有以下特性:
- 原子性:事务中的所有操作要么全部成功,要么全部失败回滚。
- 一致性:事务执行前后,数据保持一致性。
- 隔离性:事务之间互相隔离,不会相互影响。
- 持久性:事务提交后,数据持久化到数据库中,不会因为系统故障而丢失。
手动声明式事务回滚伪代码
代码语言:javascript复制 // 注入一个事务管理器
@Autowired
private PlatformTransactionManager transactionManager;
@Override
public String saveUser() {
// 定义一个默认是事务传播方式:如果没有事务,就开启一个事务使用。如调用方有事务,则使用调用方的事务
DefaultTransactionDefinition definition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
// 开启事务
TransactionStatus transaction = this.transactionManager.getTransaction(definition);
try {
// todo 业务
this.transactionManager.commit(transaction); // 提交事务
} catch (Exception e) {
transactionManager.rollback(transaction); // 回滚业务 方式1
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 回滚业务方式2
log.error("【业务失败】:触发回滚!");
}
}
事务的传播机制
使用方式:
代码语言:javascript复制@Transactional(propagation = Propagation.REQUIRED)
代码语言:javascript复制TransactionDefinition.PROPAGATION_REQUIRED
【白话】:默认的事务传播机制。只有被调用,就开一个新的事务。 90%的业务都用这个。
TransactionDefinition.PROPAGATION_SUPPORTS
【白话】:如有被调用者具有事务,则本方法加入(被调用者)父事务,如果被调用者没事务,则本方法以无事务(事务裸奔)运行。
TransactionDefinition.PROPAGATION_MANDATORY
【白话】:本方法调用者必须有事务,并加入到父事务中。如果调用者没事务,则抛出IllegalTransactionStateException异常。
TransactionDefinition.PROPAGATION_REQUIRES_NEW
【白话】:本方法开启一个新的的事务,如果父事务过程中遇到异常,与子事务无关。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
【白话】:如果调用者有事务,先挂机事务,本方法不使用任何事物执行。
TransactionDefinition.PROPAGATION_NEVER
【白话】:如果调用者有事务,本方法抛出IllegalTransactionStateException异常。就是不能在事务中运行。
TransactionDefinition.PROPAGATION_NESTED
【白话】:所有的事务,交给调用者处理。
事务的隔离级别
事务的超时时间
Spring 事务的常用 API 包括以下几种
- PlatformTransactionManager:事务管理器接口。
- TransactionDefinition:事务定义接口,定义事务的隔离级别、超时时间等。
- TransactionStatus:事务状态接口,表示事务的状态。