16:事务-Java Spring

简介: 16:事务-Java Spring

16.1 Spring事务管理原理

Spring事务管理基于AOP(面向切面编程)实现,通过拦截方法调用,对业务逻辑进行增强,确保事务的正确开启、提交或回滚。其核心组件包括:

  1. PlatformTransactionManager:事务管理器接口,定义了管理和控制事务的基本操作。具体实现如DataSourceTransactionManager(针对JDBC)、HibernateTransactionManager(针对Hibernate)等。
  2. TransactionDefinition:事务定义接口,描述事务的属性,如隔离级别、传播行为、超时时间、是否只读等。
  3. TransactionStatus:事务状态接口,用于查询和控制事务的状态。

16.2 Spring事务配置与代码示例

Spring事务可以通过XML配置、注解驱动等方式进行配置。以下为注解驱动的示例:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Transactional(rollbackFor = Exception.class)
    public void createUser(String name, String email) {
        User user = new User(name, email);
        userRepository.save(user);
        // 模拟抛出异常,触发事务回滚
        if ("error@example.com".equals(email)) {
            throw new IllegalArgumentException("Invalid email");
        }
    }
}

在上述代码中,@Transactional注解标记了createUser方法为一个事务方法。当该方法内发生未被捕获的异常时,Spring会自动回滚事务,保证数据的一致性。

16.3 事务策略的区别

隔离级别:SQL标准定义了四种隔离级别(读未提交、读已提交、可重复读、串行化),分别对应不同的并发问题(脏读、不可重复读、幻读)。Spring允许开发者根据业务需求调整隔离级别。

  • DEFAULT:由数据库决定。
  • READ_UNCOMMITTED:最低隔离级别,可能发生脏读、不可重复读、幻读。
  • READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。
  • REPEATABLE_READ:避免脏读、不可重复读,但可能出现幻读。
  • SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。
@Service
public class TransactionalService {
    // READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void readCommittedTransaction() {
        // 执行业务逻辑...
    }
    // SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void serializableTransaction() {
        // 执行业务逻辑...
    }
}

传播行为:定义了当前方法事务如何与已有事务(如果存在)交互。常见的传播行为有:

  • REQUIRED:若当前存在事务,则加入该事务;否则创建新事务。
  • REQUIRES_NEW:无论当前是否存在事务,均创建新事务。原事务挂起。
  • SUPPORTS:若当前存在事务,则加入该事务;否则以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,若当前存在事务,则挂起。
@Service
public class TransactionalService {
    @Autowired
    private AnotherService anotherService;
    // REQUIRED:如果当前存在事务,则加入该事务;否则创建新事务。
    @Transactional(propagation = Propagation.REQUIRED)
    public void requiredTransaction() {
        // 执行业务逻辑...
        anotherService.someMethod();
    }
    // REQUIRES_NEW:总是新建事务,当前事务(若有)挂起。
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void requiresNewTransaction() {
        // 执行业务逻辑...
    }
    // NEVER:不能在事务环境下执行,否则抛出异常。
    @Transactional(propagation = Propagation.NEVER)
    public void neverTransaction() {
        // 执行业务逻辑...
    }
}

超时设置:指定事务可以持续的最长时间,防止事务长时间阻塞资源。

只读标志:声明事务为只读,数据库可能据此优化查询性能,某些数据库在只读事务中不允许执行更新操作。

@Service
public class TransactionalService {
    @Transactional(readOnly = true)
    public void readOnlyTransaction() {
        // 执行只读查询操作...
    }
}

16.4 Spring事务应用场景总结

  1. 数据密集型业务:如银行转账、订单处理、库存管理等,涉及多个数据库操作,必须保证事务的ACID特性以维护数据一致性。
  2. 分布式事务:Spring支持与分布式事务解决方案(如两阶段提交、Saga模式、Seata等)集成,适用于微服务架构中的跨服务数据一致性问题。
  3. 批量操作:对于大量数据的插入、更新、删除等操作,使用事务可以确保操作的原子性,避免部分成功导致的数据不一致。
  4. 幂等性保障:对于需要保证幂等性的接口(如支付、退款等),利用事务可以确保在并发请求下,多次相同的请求对系统状态的影响与一次请求相同。

总结,Spring事务管理为开发者提供了便捷、强大的事务控制工具。理解其原理、掌握配置与使用方法,并依据业务场景选择合适的事务策略,是构建健壮、可靠的企业级应用的关键。


目录
相关文章
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
18天前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
61 21
|
8天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
40 7
|
1月前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
104 15
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
SQL Java 关系型数据库
【SpringFramework】Spring事务
本文简述Spring中数据库及事务相关衍伸知识点。
50 9
|
2月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
128 13
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
103 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
缓存 安全 Java
Spring高手之路26——全方位掌握事务监听器
本文深入探讨了Spring事务监听器的设计与实现,包括通过TransactionSynchronization接口和@TransactionalEventListener注解实现事务监听器的方法,并通过实例详细展示了如何在事务生命周期的不同阶段执行自定义逻辑,提供了实际应用场景中的最佳实践。
77 2
Spring高手之路26——全方位掌握事务监听器
|
2月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。