事务传播行为是干嘛的?

很多人不知道事务传播行为是干嘛的,首先得有一个方法调用另一个方法嘛,其次被调用的方法要声明自己的传播行为,就像是一个人喜欢另一个人,被喜欢的人声明自己是个怎么样的人。

事务传播行为(Transaction Propagation Behavior)在多层或复杂的服务架构中尤为重要,特别是在那些需要跨越多个业务边界或数据源的操作中。事务传播行为定义了在一个方法调用另一个方法时,事务应该如何传递或创建。Spring框架提供了七种事务传播行为(可以根据单词的字面意思来记),它们分别是:

  1. PROPAGATION_REQUIRED有事务就行):这是Spring默认的事务传播行为。如果当前存在事务,则加入该事务;如果当前不存在事务,则创建一个新的事务。

  2. PROPAGATION_SUPPORTS有没有随你):如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式继续执行。

  3. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

  4. PROPAGATION_REQUIRES_NEW旧的不去,新的不来):创建一个新的事务,如果当前存在事务,则挂起当前事务。

  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。

  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

  7. PROPAGATION_NESTED:如果当前存在事务,则执行一个嵌套事务;如果当前不存在事务,则其行为类似于PROPAGATION_REQUIRED

下面给大家举几个例子

具体应用场景示例

示例1:PROPAGATION_REQUIRED

假设有一个服务UserService,其中包含两个方法:updateUsersendEmailupdateUser负责更新用户信息,而sendEmail负责发送电子邮件通知。如果我们希望这两个操作要么全部成功,要么全部失败,可以将updateUser方法标记为事务性的,并在sendEmail方法中使用PROPAGATION_REQUIRED。这样,当updateUser调用sendEmail时,sendEmail将加入updateUser的事务中。

@Service
public class UserService {

    @Transactional
    public void updateUser(User user) {
        // 更新用户信息
        userRepository.save(user);
        sendEmail(user.getEmail());
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void sendEmail(String email) {
        // 发送邮件
        emailService.send(email);
    }
}
示例2:PROPAGATION_REQUIRES_NEW

假设我们有一个支付服务PaymentService,其中包含两个方法:processPaymentlogTransactionprocessPayment处理支付流程,而logTransaction记录交易日志。为了确保即使支付失败,交易日志也能被正确记录,我们可以使用PROPAGATION_REQUIRES_NEW。这意味着logTransaction总是运行在一个新的事务中,不会影响processPayment的事务状态。

@Service
public class PaymentService {

    @Transactional
    public void processPayment(Payment payment) {
        // 处理支付
        paymentRepository.save(payment);
        logTransaction(payment.getTransactionId());
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logTransaction(String transactionId) {
        // 记录交易日志
        transactionLogService.log(transactionId);
    }
}

小结

事务传播行为在设计多层次或多服务的系统时非常重要,它帮助我们管理事务的边界,确保数据的一致性和完整性。通过合理设置事务传播行为,我们可以避免一些常见的事务问题,如脏读、不可重复读和幻读等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值