事务
事务的基本概念
事务是由一系列操作组成的逻辑单元,这些操作要么全部成功,要么全部失败,一个事务具有以下特性(ACID):
- 原子性 (Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
- 一致性 (Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性 (Isolation):并发执行的事务之间互不干扰。
- 持久性 (Durability):一旦事务提交,对数据库的修改是永久性的。
spring 事务管理方式
- 编程式事务管理:通过编写代码来管理事务,适合对事务控制要求较高的场景。
- 声明式事务管理:通过配置文件或注解的方式来管理事务,更加简洁和易于维护。
使用编程式事务管理
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class MyService {
private final PlatformTransactionManager transactionManager;
public MyService(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void myTransactionalMethod() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 业务逻辑
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
}
使用声明式事务管理
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyService {
@Transactional
public void myTransactionalMethod() {
// 业务逻辑
}
}
事务隔离级别
- DEFAULT:使用数据库默认的隔离级别。
- READ_UNCOMMITTED:读未提交
- READ_COMMITTED:读已提交,ORACLE 默认
- REPEATABLE_READ:可重复读(快照读),MYSQL 默认
- SERIALIZABLE:串行化
隔离级别可能出现的问题:
隔离级别 | 描述 | 可能出现的问题 |
---|---|---|
READ UNCOMMITTED | 读未提交 | 脏读、不可重复读、幻读 |
READ COMMITTED | 读已提交 | 不可重复读、幻读 |
REPEATABLE READ | 可重复读(快照读) | 幻读 |
SERIALIZABLE | 串行化 | 无 |
并发场景的问题描述:
问题 | 描述 |
---|---|
脏读 | A 事务可以读取 B 事务未提交的数据,当 A 读完 B 回滚,A 读到了脏数据 |
不可重复读 | A 事务查询某条数据后,B 事务修改了并提交,A 再次读取,发现两次读取不一致 |
幻读 | A 事务查询一个范围数据,B 事务删除或增加这个范围的数据,A 再次读取,发现数据条数不一致 |
问题都是读相关,为什么写不会有问题?因为写本身就是独占锁,写不会出问题
事务传播行为
- REQUIRED:支持当前事务,如果没有事务则新建一个事务(默认行为)
- SUPPORTS:支持当前事务,如果没有事务当前操作以无事务性执行
- MANDATORY:支持当前事务,如果不存在则抛出异常
- REQUIRES_NEW:总是新建一个事务
- NESTED:如果当前存在事务,则在嵌套事务中执行。如果没有就新建一个事务
- NOT_SUPPORTES:非事务执行,如果存在事务,暂停事务(保证自己不以事务执行)
- NEVER:非事务执行,如果存在事务,抛出异常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具