Spring框架的事务管理

Spring 框架的事务管理是其核心功能之一,主要用于简化数据库事务的控制,确保数据操作的原子性、一致性、隔离性和持久性(ACID 特性)。以下是关于 Spring 事务管理的关键知识点:

1. 事务管理的核心接口

Spring 通过一套抽象接口实现事务管理,核心接口包括:

  • PlatformTransactionManager :事务管理器接口,定义了事务的提交、回滚等操作,具体实现依赖于底层持久化技术(如 JDBC、Hibernate 等)。
    • 常见实现类:
      • DataSourceTransactionManager:用于 JDBC 或 MyBatis。
      • HibernateTransactionManager:用于 Hibernate。
      • JpaTransactionManager:用于 JPA。
  • TransactionDefinition:定义事务属性(如隔离级别、传播行为、超时时间等)。
  • TransactionStatus:表示事务的当前状态(如是否活跃、是否已提交等)。

2. 事务属性

通过TransactionDefinition定义的事务属性包括:

  • 传播行为 :解决多个事务方法调用时的事务传播规则(最常用属性)。
    • REQUIRED(默认):如果当前有事务,则加入;否则新建事务。
    • REQUIRES_NEW:无论当前是否有事务,都新建事务(原事务暂停)。
    • SUPPORTS:如果当前有事务,则加入;否则以非事务方式执行。
    • MANDATORY:必须在事务中执行,否则抛异常。
    • NEVER:必须以非事务方式执行,否则抛异常。
    • NESTED:如果当前有事务,则嵌套在其内部(类似保存点);否则新建事务。
  • 隔离级别 :解决并发事务的干扰问题。
    • DEFAULT(默认):使用数据库默认隔离级别。
    • READ_UNCOMMITTED:允许读取未提交数据(可能脏读、不可重复读、幻读)。
    • READ_COMMITTED:只能读取已提交数据(避免脏读,可能不可重复读、幻读)。
    • REPEATABLE_READ:确保重复读取数据一致(避免脏读、不可重复读,可能幻读)。
    • SERIALIZABLE:完全串行化(避免所有并发问题,性能最低)。
  • 超时时间:事务执行的最大时间(默认由数据库决定)。
  • 只读属性 :设置为true时,事务仅读取数据(优化性能,不允许写操作)。

3. 事务管理方式

Spring 支持两种事务管理方式:

(1)声明式事务管理(推荐)

通过注解或 XML 配置声明事务规则,无需手动编写事务控制代码,耦合度低。

  • 注解方式 (最常用):

    • 在配置类上添加@EnableTransactionManagement开启事务支持。
    • 在需要事务的方法上添加@Transactional注解,并指定属性(如传播行为、隔离级别等)。

    java

    运行

    复制代码
    @Service
    public class UserService {
        @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
        public void transferMoney() {
            // 数据库操作(如转账)
        }
    }
  • XML 配置方式 :通过<tx:advice>和 AOP 切点定义事务规则。

(2)编程式事务管理

手动编写代码控制事务(如TransactionTemplate),灵活性高但耦合度高,适用于复杂场景。

java

运行

复制代码
@Service
public class UserService {
    @Autowired
    private TransactionTemplate transactionTemplate;

    public void transferMoney() {
        transactionTemplate.execute(status -> {
            // 数据库操作
            return null;
        });
    }
}

4. 事务回滚规则

默认情况下,Spring 事务在遇到未检查异常(RuntimeException及其子类)错误(Error 时会回滚,而遇到已检查异常(如IOException 时不会回滚。

可通过@TransactionalrollbackFornoRollbackFor属性自定义回滚规则:

java

运行

复制代码
@Transactional(rollbackFor = Exception.class, noRollbackFor = BusinessException.class)
public void doSomething() throws Exception {
    // ...
}

5. 注意事项

  • @Transactional注解生效范围 :只能标注在public 方法上(非 public 方法注解可能不生效,取决于 AOP 代理方式)。
  • 自调用问题 :同一类中方法调用时,被调用方法的@Transactional注解可能失效(因未经过 Spring 代理),需通过代理对象调用或使用@EnableAspectJAutoProxy(exposeProxy = true)
  • 事务传播行为的合理选择 :例如,日志记录方法通常用REQUIRES_NEW,避免主事务回滚影响日志。
  • 性能考虑 :过高的隔离级别(如SERIALIZABLE)会导致并发性能下降,需根据业务场景选择。

Spring 事务管理通过抽象化底层技术,提供了一致的事务控制方式,极大简化了企业级应用的事务处理逻辑。实际开发中,声明式事务(尤其是注解方式)是主流选择。

相关推荐
云飞云共享云桌面2 小时前
医疗器械设备研发:多人同时操作 SolidWorks,怎样依靠单台服务器替代多工作站
运维·服务器·网络·数据库·制造
知行合一。。。7 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)8 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
上学的小垃圾9 小时前
01-数据库系统概述
数据库
二进制漫游记9 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996229 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄11 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato12 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67313 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy32213 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物