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里面手动添加事务的回滚,即这样:也可以参考博客:
@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 } }
下一篇:
Linux用户和权限管理实验