当前位置:   article > 正文

Spring 事务传播行为之Propagation.NESTED REQUIRES_NEW等探讨

Spring 事务传播行为之Propagation.NESTED REQUIRES_NEW等探讨

        当一个事务方法(标记为@Transactional(propagation = Propagation.NESTED))被另一个活动事务调用时,它会创建一个“保存点”(Savepoint)作为新的事务开始点。这意味着,如果这个嵌套事务方法内部发生异常并导致回滚,事务会回滚到这个保存点,而不会影响到外部事务的其他操作。如果一切正常,嵌套事务会在外部事务结束时一起提交。

标记为@Transactional(propagation = Propagation.REQUIRES_NEW

和Propagation.NESTED 接近但是NESTED不是所有数据库都支持mybatis就不支持

示例:        

  1. @Service
  2. public class UserService {
  3. @Transactional(propagation = Propagation.REQUIRES_NEW)
  4. public void createUserAndSendWelcomeEmail(User user) {
  5. userDao.createUser(user);
  6. emailService.sendWelcomeEmail(user.getEmail()); // 假设这里可能抛出异常
  7. }
  8. }
  9. @Service
  10. public class EmailService {
  11. @Transactional(propagation = Propagation.NESTED)
  12. public void sendWelcomeEmail(String email) {
  13. // 发送邮件逻辑
  14. // 如果发送邮件失败,此方法的事务会回滚到保存点,不影响createUser操作
  15. }
  16. }

其实我感觉这样子,其实可以在ctrl层写,直接在一个ctrl层调用2个service 

而当@transation 事务 调用存储过程里面也有事务,怎么独立这两个事务?

  1. @Transactional(propagation = Propagation.REQUIRES_NEW)
  2. public void callIndependentProcedure() {
  3. // 调用包含事务处理的存储过程
  4. }
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. import org.springframework.transaction.annotation.Propagation;
  4. import org.springframework.transaction.annotation.Transactional;
  5. @Service
  6. public class YourService {
  7. @Autowired
  8. private YourMapper yourMapper;
  9. @Transactional(propagation = Propagation.REQUIRES_NEW)
  10. public void callProcedureInNewTransaction() {
  11. try {
  12. // 调用Mapper方法,该方法内部会调用包含事务的存储过程
  13. callIndependentProcedure();
  14. } catch (Exception e) {
  15. // 异常处理
  16. // 这里可以根据需要决定是否抛出异常,以决定事务是否回滚
  17. throw new ServiceException("Error while calling procedure", e);
  18. }
  19. }
  20. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号