事务传播——propagation

本文详细介绍了Java中@Transactional注解的传播行为,包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED等,解析了它们在事务处理中的应用场景和效果,帮助理解如何在不同场景下选择合适的事务管理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    @Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public Stu getStuInfo(int id) {
        return stuMapper.selectByPrimaryKey(id);
    }
  • REQUIRED(required):使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的。如果当前存在事务,则加入这个事务,成为一个整体。(举例:子方法有事务,调用的方法不一定要有事务,但若调用的父方法有事务,子方法也会有事务支持。多用于 增删改)
  • SUPPORTS(supports):如果当前有事务,则使用事务;如果当前没有事务,则不使用事务。(不管子方法有没有事务,若父调用方法有事务,则子方法有事务,反之,父没子没。多用于 查询
  • MANDATORY(mandatory):该传播属性强制必须存在一个事务,如果不存在,则抛出异常(举例:子方法有事务支持,那么调用该方法的父方法也必须有事务,不然抛出异常)
  • REQUIRES_NEW(requires_new):如果当前有事务,则挂起事务,并且自己创建一个新的事务给自己用;如果当前没有事务,则同REQUIRED
  • NOT_SUPPORTED(not_supported):如果当前有事务,则把事务挂起,自己不使用事务去执行数据库操作。
  • NEVER(never):如果当前有事务存在,则抛出异常。
  • NESTED(nested):如果当前没有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或回滚;如果当前没有事务,则同REQUIRED。但是如果主事务提交,则会携带子事务一起提交。如果主事务回滚,则子事务一起回滚。相反,子事务异常,则父事务可选择回滚或不回滚(抛出子事务的异常就不用回滚,不抛出就一起回滚)
### Spring 框架中的事务传播机制 #### 解释 Spring框架中的事务传播行为定义了当一个事务方法被另一个事务方法调用时的行为方式。这种特性允许开发人员灵活控制不同业务逻辑间的事务边界,确保数据一致性和完整性[^2]。 主要的传播属性有七种: - `REQUIRED` (默认): 如果当前存在事务,则加入该事务;如果不存在则创建一个新的事务。 - `SUPPORTS`: 支持当前事务,如果没有事务也可以执行非事务的方法。 - `MANDATORY`: 使用现有的事务运行,如果没有活动事务抛出异常。 - `REQUIRES_NEW`: 创建新事务,在此期间暂停任何现有事务。 - `NOT_SUPPORTED`: 不支持事务处理,总是以非事务形式执行,并挂起存在的事务。 - `NEVER`: 总是以非事务方式执行,如果有活跃事务则抛出异常。 - `NESTED`: 若已有事务存在则在嵌套事务内执行;否则启动新的事务。 #### 示例 下面是一个简单的例子来展示如何配置和应用这些传播行为之一——`REQUIRES_NEW`: ```java @Service public class TransactionService { @Autowired private AnotherService anotherService; @Transactional(propagation = Propagation.REQUIRED) public void outerMethod() { try { innerMethod(); } catch (Exception e) { System.out.println("Outer method caught exception"); } } @Transactional(propagation = Propagation.REQUIRES_NEW) public void innerMethod() throws Exception { // Some database operations here... throw new RuntimeException("Simulated error"); } } ``` 在这个案例中,即使内部方法失败并回滚其更改,外部方法仍然能够继续正常提交自己的变更[^1]。 #### 最佳实践 为了充分利用Spring提供的强大功能,建议遵循以下几点最佳做法: - 明确理解各个传播级别的含义及其适用场景; - 尽量减少不必要的事务范围扩大,只对确实需要的地方开启事务; - 对于长时间运行的操作考虑使用异步处理或分批提交策略; - 定期审查代码库中的事务配置,确保它们符合最新的业务需求和技术标准; - 测试阶段务必覆盖各种可能的情况,特别是涉及多层调用链路下的事务一致性验证[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值