有关事务的总结
一、事务的基本概念
事务(Transaction) 是一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,具有 ACID 特性。
- 事务特性--->ACID 特性:
原子性(Atomicity):事务是一个不可分割的工作单位,里面的操作要么全部成功,要么全部失败
一致性(Consistency):事务开始前到事务结束后,数据总量保持不变,即必须使数据库从一个一致状态变换到另一个一致状态。
隔离性(Isolation):事务之间相互隔离,互不影响,多个事务并发执行时,一个事务的执行不应影响其他事务。
持久性(Durability):事务一旦提交,其对数据库的修改就是永久性的。
命令:begin开启事务 commit提交事务 rollback回滚事务
二、Spring 中的事务管理
Spring 提供了声明式事务管理和编程式事务管理两种方式。
- 声明式事务管理
通过注解 @Transactional 实现,推荐使用。
点击查看代码
@Service
public class UserService {
@Transactional
public void transferMoney(User fromUser, User toUser, BigDecimal amount) {
// 扣款
fromUser.setBalance(fromUser.getBalance().subtract(amount));
// 入账
toUser.setBalance(toUser.getBalance().add(amount));
}
}
- 编程式事务管理
通过 TransactionTemplate 或 PlatformTransactionManager 手动控制事务边界。
点击查看代码
@Autowired
private TransactionTemplate transactionTemplate;
public void doInTransaction() {
transactionTemplate.execute(status -> {
// 数据库操作
return null;
});
}
三、事务传播行为(Propagation)
事务传播行为定义了方法在调用过程中如何参与事务。
传播行为
描述
REQUIRED
如果当前存在事务,则加入;否则新建一个事务(默认)
REQUIRES_NEW
总是新建事务,并挂起当前事务(如果有的话)
SUPPORTS
支持当前事务,不存在则以非事务方式执行
NOT_SUPPORTED
不支持事务,总是以非事务方式执行
MANDATORY
必须存在事务,否则抛出异常
NEVER
不能存在事务,否则抛出异常
NESTED
在嵌套事务中执行