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

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

    }
  }

 

 

 

 

Spring中,我们可以通过编程的方式(即手动)来开启事务。具体步骤如下: 1. 在Spring配置文件中开启事务管理器: ``` <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> ``` 2. 在需要开启事务的方法上添加@Transactional注解: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Transactional public void transferMoney(int fromUserId, int toUserId, double money) { User fromUser = userDao.getUserById(fromUserId); User toUser = userDao.getUserById(toUserId); fromUser.setBalance(fromUser.getBalance() - money); toUser.setBalance(toUser.getBalance() + money); userDao.updateUser(fromUser); userDao.updateUser(toUser); } } ``` 在上面的例子中,我们在transferMoney方法上添加了@Transactional注解,这样Spring就会自动开启事务,并在方法执行完毕后自动提交回滚事务。 需要注意的是,如果我们在一个类中调用了另一个类中被@Transactional注解的方法,那么事务并不会自动传播。因此,需要在调用方的方法上也添加@Transactional注解,并设置propagation属性为REQUIRED。例如: ``` @Service public class OrderServiceImpl implements OrderService { @Autowired private UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void placeOrder(int userId, double amount) { // 生成订单,并扣除用户账户余额 userService.transferMoney(userId, 1, amount); // ... } } ``` 在上面的例子中,我们在placeOrder方法上也添加了@Transactional注解,并设置propagation属性为REQUIRED,这样事务就能够正确传播。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值