Spring Boot 技术问题教程:@Transactional注解与事务管理

2024-12-01 0 342

Spring Boot 技术问题教程:@Transactional注解事务管理

引言

事务管理在应用程序开发中非常重要,特别是在处理数据库操作时,能够确保数据的一致性和完整性。Spring Boot 提供了强大的事务管理支持,其中 @Transactional 注解是实现事务管理的关键之一。本文将详细介绍如何在 Spring Boot 中使用 @Transactional 注解进行事务管理,并包含一个详细的案例。

@Transactional 注解简介

@Transactional 注解可以应用于类或方法上,用于声明性的事务管理。当方法被该注解修饰时,Spring 将使用声明式事务管理来自动地管理事务。@Transactional 注解的属性包括:

  • propagation:事务的传播行为,默认值为 REQUIRED。
  • isolation:事务的隔离级别,默认值为 DEFAULT。
  • timeout:事务的超时时间,单位为秒,默认值为 -1(表示无超时限制)。
  • readOnly:标记事务是否为只读的,默认为 false。
  • rollbackFor 和 noRollbackFor:定义哪些异常会触发事务回滚,哪些不会。

案例讲解

下面是一个详细的案例,展示了如何在 Spring Boot 中使用 @Transactional 注解进行事务管理。

场景描述

我们假设有一个简单的银行账户转账系统,包含以下两个实体类:Account 和 Transaction。Account 类表示账户,包含账户编号和余额等属性;Transaction 类表示转账记录,包含转账金额、转出账户和转入账户等属性。

代码实现

1. 数据模型

    
// Account.java
@Entity
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String number;
    private Double balance;

    // getter 和 setter 方法...
}

// Transaction.java
@Entity
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Double amount;
    @ManyToOne
    @JoinColumn(name = "from_account_id")
    private Account fromAccount;
    @ManyToOne
    @JoinColumn(name = "to_account_id")
    private Account toAccount;

    // getter 和 setter 方法...
}
    
    

2. Service 类

    
@Service
public class AccountService {

    @Autowired
    private AccountRepository accountRepository;

    @Autowired
    private TransactionRepository transactionRepository;

    @Transactional
    public void transfer(Long fromAccountId, Long toAccountId, Double amount) {
        Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(() -> new IllegalArgumentException("转出账户不存在"));
        Account toAccount = accountRepository.findById(toAccountId).orElseThrow(() -> new IllegalArgumentException("转入账户不存在"));

        if (fromAccount.getBalance() < amount) {
            throw new IllegalArgumentException("余额不足");
        }

        fromAccount.setBalance(fromAccount.getBalance() - amount);
        toAccount.setBalance(toAccount.getBalance() + amount);

        Transaction transaction = new Transaction();
        transaction.setAmount(amount);
        transaction.setFromAccount(fromAccount);
        transaction.setToAccount(toAccount);

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

3. 控制器类

    
@RestController
@RequestMapping("/api/accounts")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @PostMapping("/transfer")
    public ResponseEntity<String> transfer(@RequestParam Long fromAccountId, @RequestParam Long toAccountId, @RequestParam Double amount) {
        try {
            accountService.transfer(fromAccountId, toAccountId, amount);
            return ResponseEntity.ok("转账成功");
        } catch (Exception e) {
            return ResponseEntity.badRequest().body("转账失败: " + e.getMessage());
        }
    }
}
    
    

4. 运行和测试

启动 Spring Boot 应用后,可以使用 Postman 或其他工具发送 HTTP POST 请求到 /api/accounts/transfer,并传入转出账户ID、转入账户ID和转账金额。例如:

请求 URL: http://localhost:8080/api/accounts/transfer

请求参数: fromAccountId=1, toAccountId=2, amount=100.00

如果转账成功,将返回 “转账成功”;如果转账失败(例如余额不足或账户不存在),将返回相应的错误信息。

总结

本文详细介绍了如何在 Spring Boot 中使用 @Transactional 注解进行事务管理,并通过一个具体的银行账户转账案例进行了详细讲解。希望能够帮助开发者更好地理解和应用事务管理。

Spring
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

本站尊重知识产权,如知识产权权利人认为平台内容涉嫌侵犯到您的权益,可通过邮件:8990553@qq.com,我们将及时删除文章
本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除

腾谷资源站 SpringBoot Spring Boot 技术问题教程:@Transactional注解与事务管理 https://www.tenguzhan.com/1719.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务