springboot @Transactional的概念以及实战

简介: 【4月更文挑战第25天】在Spring Boot中,@Transactional注解是用来声明一个方法或类中所有公共方法的事务边界。这个注解主要由Spring框架提供的声明式事务管理机制支持。使用@Transactional可以极大简化事务管理的复杂性,确保数据的一致性和完整性。

在Spring Boot中,@Transactional注解是用来声明一个方法或类中所有公共方法的事务边界。这个注解主要由Spring框架提供的声明式事务管理机制支持。使用@Transactional可以极大简化事务管理的复杂性,确保数据的一致性和完整性。

概念

@Transactional注解负责开启、提交或回滚一个事务。它的工作原理是基于AOP(面向切面编程),在被注解的方法被调用时创建一个事务,并在方法执行结束时根据执行情况提交或回滚事务。如果方法正常完成,事务将被提交;如果方法抛出运行时异常,事务将被回滚。

核心属性

  • propagation:定义事务的传播行为。例如,Propagation.REQUIRED 表示当前方法必须运行在一个事务中;如果已经存在一个事务,那么方法会在这个事务中运行,否则会启动一个新的事务。
  • isolation:定义事务的隔离级别,如 Isolation.DEFAULT,这取决于底层数据库的默认隔离级别。
  • timeout:定义在事务被回滚前可以运行的时间(以秒为单位)。
  • readOnly:指示事务是否只读。这个属性可以帮助数据库应用一些优化,比如避免脏读。
  • rollbackFor:定义哪些异常可以触发事务回滚。
  • noRollbackFor:定义哪些异常不会触发事务回滚。


优点

  1. 简化事务管理@Transactional提供了一种声明式的方式来管理事务,这意味着开发者可以不必手动控制事务的开启、提交或回滚,简化了代码和减少了错误的可能性。
  2. 一致性和数据完整性:通过确保操作要么完全成功,要么在出现错误时完全回滚,@Transactional帮助维护数据库的一致性和数据的完整性。
  3. 灵活的配置选项:提供了多种事务属性配置,如传播行为、隔离级别、超时设置等,可以根据具体需求灵活应用。
  4. 整合支持:与Spring框架的其他部分(如JPA、Hibernate)紧密整合,提供了跨多种数据库和ORM技术的一致性事务支持。

缺点

  1. 性能开销@Transactional基于代理模式工作,这意味着每次调用被注解的方法时,Spring都需要创建一个代理来处理事务逻辑,这可能会引入额外的性能开销。
  2. 传播行为误用:事务的传播行为如果设置不当,可能会导致意想不到的事务行为。例如,嵌套事务和不同的传播行为组合可能会复杂化事务管理,增加出错风险。
  3. 仅限于运行时异常回滚:默认情况下,@Transactional只对运行时异常进行回滚。如果需要对检查型异常进行回滚,需要额外配置,这可能会导致配置错误。
  4. 测试复杂性:在单元测试中模拟事务行为可能比较困难,特别是在使用内存数据库或不完全支持嵌套事务的数据库时。
  5. 代理限制@Transactional注解使用Spring AOP代理,这意味着它仅作用于public方法,并且自调用(即在同一个类内部的方法调用)默认不会启动新的事务。

总的来说,虽然@Transactional提供了强大的工具来简化事务管理,确保数据一致性和完整性,但在使用时需要注意其性能影响和适当的配置,以避免潜在的问题。在设计和实施时,合理使用@Transactional,权衡其利弊,可以显著提高应用的健壮性和维护性。


实战示例

假设有一个银行应用,我们需要在用户账户之间进行转账,这个操作应该是原子的,要么全部成功,要么全部失败。下面是如何使用@Transactional来实现这个功能的示例:

java复制代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class BankingService {

    @Autowired
    private AccountRepository accountRepository;

    // 此方法在一个事务中执行
    @Transactional(rollbackFor = Exception.class)
    public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) throws Exception {
        Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(() -> new Exception("Account not found"));
        Account toAccount = accountRepository.findById(toAccountId).orElseThrow(() -> new Exception("Account not found"));

        fromAccount.debit(amount);
        toAccount.credit(amount);

        accountRepository.save(fromAccount);
        accountRepository.save(toAccount);
    }
}

在这个例子中,transferMoney方法被标记为@Transactional,这意味着整个转账操作要么完全成功,要么在发生任何异常的情况下完全回滚。这确保了数据的一致性和完整性。

使用@Transactional注解使得事务管理既简单又安全,是Spring提供的关键功能之一,尤其是在处理复杂的业务逻辑和数据操作时。

相关文章
|
6月前
|
存储 Java Maven
Spring Boot WebFlux 增删改查完整实战 demo
Spring Boot WebFlux 增删改查完整实战 demo
|
2月前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
236 6
|
7月前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
105 3
|
7月前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
90 1
|
3月前
|
缓存 NoSQL Java
Springboot实战——黑马点评之秒杀优化
【9月更文挑战第27天】在黑马点评项目中,秒杀功能的优化对提升系统性能和用户体验至关重要。本文提出了多项Spring Boot项目的秒杀优化策略,包括数据库优化(如索引和分库分表)、缓存优化(如Redis缓存和缓存预热)、并发控制(如乐观锁、悲观锁和分布式锁)以及异步处理(如消息队列和异步任务执行)。这些策略能有效提高秒杀功能的性能和稳定性,为用户提供更佳体验。
191 6
|
4月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
4月前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
81 2
|
4月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
195 0
|
4月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
285 0
|
4月前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
57 0