spring手动开启事务,手动提交事务,手动回滚事务

本文探讨了Spring中事务管理的两种方式:手动管理和注解驱动。手动管理事务需要显式调用`TransactionDefinition`、`TransactionStatus`进行开启、提交和回滚。而使用`@Transactional`注解时,如果捕获到异常但未处理事务,事务将不会回滚,需要在catch块中设置`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`来触发回滚。

1.未加事务注解(或者事务配置), 所以需要手动开启事务和手动提交事务和手动回滚事务

@Autowired
  private PlatformTransactionManager txManager;

  @Autowired
  private ShopGroupBuyDao shopGroupBuyDao;

  @GetMapping(value = "/transactionDemo")
  public void ceshi() {

    // 手动开启事务  start
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus status = txManager.getTransaction(def);
    // 手动开启事务  end

    try {

      ShopGroupBuy shopGroupBuy = shopGroupBuyDao.selectOne(new LambdaQueryWrapper<ShopGroupBuy>()
                                                                .eq(ShopGroupBuy::getGroupBuyId, 505));

      shopGroupBuy.setGroupBuyTheme("wulin11");

      int i = shopGroupBuyDao.updateById(shopGroupBuy);

      int a = 1 / 0;

      // 手动提交事务  start
      txManager.commit(status);
      // 手动提交事务  end

      if (i > 0) {
        System.out.println("更新成功");
      } else {
        System.out.println("更新失败");
      }

    } catch(Exception e) {

      e.printStackTrace();

      // 手动回滚事务  start
      txManager.rollback(status);
      // 手动回滚事务  end
      
    }
  }

 

 

 

 

2.加事务注解

这里演示加了事务注解(@Transactional(rollback=Exception.class)), 且在代码中也加了try catch相当于没有加事务注解, 所以事务不起作用, 此时就需要在catch里面手动添加事务的回滚,即这样:也可以参考博客:https://blog.csdn.net/qq_26106607/article/details/83827630

  @Autowired
  private ShopGroupBuyDao shopGroupBuyDao;

  @GetMapping(value = "/transactionDemo")
  @Transactional(rollbackFor = Exception.class)
  public void ceshi() {

    try {

      ShopGroupBuy shopGroupBuy = shopGroupBuyDao.selectOne(new LambdaQueryWrapper<ShopGroupBuy>()
                                                                .eq(ShopGroupBuy::getGroupBuyId, 505));

      shopGroupBuy.setGroupBuyTheme("wulin11");

      int i = shopGroupBuyDao.updateById(shopGroupBuy);

      int a = 1 / 0;

      if (i > 0) {
        System.out.println("更新成功");
      } else {
        System.out.println("更新失败");
      }

    } catch(Exception e) {

      e.printStackTrace();

      // 手动回滚事务  start
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      // 手动回滚事务  end

    }
  }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值