Spring 中@transactional 如何使用

发布时间:2021-07-30 16:09:33 作者:Leah
来源:亿速云 阅读:219
# Spring 中@Transactional 如何使用

## 目录
1. [引言](#引言)
2. [@Transactional 基础概念](#基础概念)
   - 2.1 [什么是事务](#什么是事务)
   - 2.2 [Spring 事务管理机制](#spring-事务管理机制)
3. [@Transactional 核心用法](#核心用法)
   - 3.1 [基本声明方式](#基本声明方式)
   - 3.2 [方法级 vs 类级注解](#方法级-vs-类级注解)
4. [事务传播行为详解](#事务传播行为)
   - 4.1 [7种传播行为说明](#7种传播行为说明)
   - 4.2 [实际应用场景](#实际应用场景)
5. [事务隔离级别配置](#事务隔离级别)
   - 5.1 [四大隔离级别](#四大隔离级别)
   - 5.2 [脏读/幻读/不可重复读](#脏读幻读不可重复读)
6. [事务超时与回滚规则](#超时与回滚)
   - 6.1 [timeout 配置](#timeout-配置)
   - 6.2 [异常回滚控制](#异常回滚控制)
7. [常见问题排查](#常见问题排查)
   - 7.1 [失效场景分析](#失效场景分析)
   - 7.2 [调试技巧](#调试技巧)
8. [高级应用场景](#高级应用场景)
   - 8.1 [多数据源事务](#多数据源事务)
   - 8.2 [编程式事务管理](#编程式事务管理)
9. [最佳实践总结](#最佳实践)
10. [结语](#结语)

---

## 引言
在现代企业级应用开发中,事务管理是保证数据一致性的关键技术。Spring Framework 通过`@Transactional`注解提供了声明式事务管理的能力,相比传统的编程式事务管理,可以大幅减少样板代码。本文将全面剖析该注解的使用方法和底层原理。

---

## 基础概念

### 什么是事务
事务(Transaction)是数据库操作的最小工作单元,具有ACID特性:
- **原子性**(Atomicity):事务内的操作要么全部成功,要么全部回滚
- **一致性**(Consistency):事务执行前后数据库状态保持一致
- **隔离性**(Isolation):并发事务之间互不干扰
- **持久性**(Durability):事务提交后结果永久保存

### Spring 事务管理机制
Spring 事务抽象的核心接口:
```java
public interface PlatformTransactionManager {
    TransactionStatus getTransaction(TransactionDefinition definition);
    void commit(TransactionStatus status);
    void rollback(TransactionStatus status);
}

实现类包括: - DataSourceTransactionManager:JDBC单数据源事务 - JpaTransactionManager:JPA事务管理 - JtaTransactionManager:分布式事务管理


核心用法

基本声明方式

@Service
public class OrderService {
    
    @Transactional
    public void createOrder(Order order) {
        // 数据库操作
    }
}

方法级 vs 类级注解

注解级别 作用范围 使用场景
方法级 仅标注的方法 需要精细控制事务的方法
类级 类中所有public方法 统一事务策略的Service类

事务传播行为

7种传播行为说明

  1. REQUIRED(默认):当前有事务则加入,没有则新建
  2. SUPPORTS:当前有事务则加入,没有则以非事务运行
  3. MANDATORY:必须存在事务,否则抛出异常
  4. REQUIRES_NEW:新建独立事务,挂起当前事务
  5. NOT_SUPPORTED:以非事务方式执行,挂起当前事务
  6. NEVER:必须在非事务环境下执行,否则抛异常
  7. NESTED:嵌套事务执行

实际应用场景

// 订单服务主方法
@Transactional(propagation = Propagation.REQUIRED)
public void processOrder() {
    // 调用库存服务(需要独立事务)
    inventoryService.reduceStock();
}

// 库存服务方法
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void reduceStock() {
    // 库存扣减操作
}

事务隔离级别

四大隔离级别

隔离级别 脏读 不可重复读 幻读
READ_UNCOMMITTED
READ_COMMITTED(默认)
REPEATABLE_READ
SERIALIZABLE

配置示例:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void updateAccount() {
    // 业务逻辑
}

超时与回滚

timeout 配置

@Transactional(timeout = 5) // 单位:秒
public void batchProcess() {
    // 长时间操作
}

异常回滚控制

默认回滚规则: - 遇到RuntimeException和Error时回滚 - 受检异常(checked exception)不回滚

自定义回滚:

@Transactional(rollbackFor = BusinessException.class,
               noRollbackFor = IllegalArgumentException.class)

常见问题排查

失效场景分析

  1. 注解应用到非public方法
  2. 自调用问题(同类方法调用)
  3. 异常被捕获未抛出
  4. 数据库引擎不支持(如MyISAM)

解决方案:

// 通过AopContext解决自调用问题
((YourService) AopContext.currentProxy()).methodWithTransaction();

高级应用场景

多数据源事务

使用ChainedTransactionManager或JTA实现:

@Bean
public PlatformTransactionManager transactionManager() {
    return new ChainedTransactionManager(
        new DataSourceTransactionManager(dataSource1),
        new JpaTransactionManager(entityManagerFactory)
    );
}

最佳实践

  1. 明确指定rollbackFor属性
  2. 事务方法尽量保持短小
  3. 避免在事务中进行远程调用
  4. 合理设置超时时间
  5. 使用@Transactional(readOnly=true)优化查询

结语

掌握@Transactional的深度使用是Spring开发者的必备技能。通过本文的系统讲解,读者应该能够根据实际业务场景灵活配置事务属性,并有效避免常见的陷阱。建议结合Spring官方文档和实际项目实践来巩固这些知识。

本文共计约6350字,完整代码示例可参考Spring官方示例项目 “`

注:此为精简版大纲框架,实际6350字完整文章需要包含: 1. 更详细的原理解析(AOP代理机制等) 2. 完整的代码示例(包含异常处理场景) 3. 性能优化建议 4. 与Spring Boot的整合配置 5. 事务监控方案(如Micrometer指标) 6. 分布式事务方案对比(Seata等) 需要展开每个章节的详细内容才能达到完整字数要求。

推荐阅读:
  1. Spring 中的事务管理如何使用注解实现配置
  2. 事务如何在Spring Boot 中使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring @transactional

上一篇:使用FluentScheduler怎么实现定时任务

下一篇:hibernate中怎么使用configuration类配置数据库

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》