事务

事务的基本概念

事务是由一系列操作组成的逻辑单元,这些操作要么全部成功,要么全部失败,一个事务具有以下特性(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:非事务执行,如果存在事务,抛出异常
posted @   CyrusHuang  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示