springboot自定义事务

1.在springBoot项目中service的实现类可以通过注解@Transactional添加事务

        注意:必须是public方法 , 默认捕捉运行时异常

1.1 如果在Service层用了try catch,在catch里面再抛出一个 RuntimeException异常,这样出了异常才会回滚

1.2你还可以直接在catch后面写一句回滚代码(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();来实现回滚,这样的话,就可以在抛异常后也能return 返回值;比较适合需要拿到Service层的返回值的场景。

2.可以通过设置包名统一设置事务

3.自定义代码内设置事务
(1).注入事务管理类

	 @Resource
	 PlatformTransactionManager platformTransactionManager;
	 @Resource
	 TransactionDefinition transactionDefinition;

2)使用事务

@Resource
private OrderMapper orderMapper;
@Resource
private OrderItemMapper orderItemMapper;
@Resource
private ProductMapper productMapper;
//购买商品id
private int purchaseProductId = 100100;
//购买商品数量
private int purchaseProductNum = 1;
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;

private Lock lock = new ReentrantLock();


//    @Transactional(rollbackFor = Exception.class)
public Integer createOrder() throws Exception
{
   Product product = null;

   lock.lock();
   try
   {
      TransactionStatus transaction1 = platformTransactionManager.getTransaction(transactionDefinition);
      product = productMapper.selectByPrimaryKey(purchaseProductId);
      if(product == null)
      {
         platformTransactionManager.rollback(transaction1);
         throw new Exception("购买商品:" + purchaseProductId + "不存在");
      }

      //商品当前库存
      Integer currentCount = product.getCount();
      System.out.println(Thread.currentThread().getName() + "库存数:" + currentCount);
      //校验库存
      if(purchaseProductNum > currentCount)
      {
         platformTransactionManager.rollback(transaction1);
         throw
               new Exception("商品" + purchaseProductId + "仅剩" + currentCount + "件,无法购买");
      }

      productMapper.updateProductCount(purchaseProductNum, "xxx", new Date(), product.getId());
      platformTransactionManager.commit(transaction1);
   }
   finally
   {
      lock.unlock();
   }

   TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
   Order order = new Order();
   order.setOrderAmount(product.getPrice().multiply(new BigDecimal(purchaseProductNum)));
   order.setOrderStatus(1);//待处理
   order.setReceiverName("xxx");
   order.setReceiverMobile("13311112222");
   order.setCreateTime(new Date());
   order.setCreateUser("xxx");
   order.setUpdateTime(new Date());
   order.setUpdateUser("xxx");
   orderMapper.insertSelective(order);

   OrderItem orderItem = new OrderItem();
   orderItem.setOrderId(order.getId());
   orderItem.setProductId(product.getId());
   orderItem.setPurchasePrice(product.getPrice());
   orderItem.setPurchaseNum(purchaseProductNum);
   orderItem.setCreateUser("xxx");
   orderItem.setCreateTime(new Date());
   orderItem.setUpdateTime(new Date());
   orderItem.setUpdateUser("xxx");
   orderItemMapper.insertSelective(orderItem);
   platformTransactionManager.commit(transaction);
   return order.getId();
}
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以通过自定义组件来实现对应用程序的定制和扩展。下面是一些常见的自定义组件: 1. 自定义Starter:Spring Boot提供了Starter依赖的机制,可以简化依赖管理和配置。你可以创建自己的Starter,将常用的依赖、配置和自动配置打包成一个模块,方便其他项目引用和使用。 2. 自定义自动配置类:Spring Boot通过自动配置类来自动配置一些常用的组件和功能。你可以创建自己的自动配置类,并通过条件注解来控制其生效条件,从而实现对特定组件或功能的自定义配置。 3. 自定义注解:通过自定义注解,你可以实现对某些类、方法或属性的标记,从而在应用程序中实现特定的逻辑。比如,可以创建一个自定义注解来标记需要进行事务管理的方法,然后通过AOP技术实现对这些方法的事务处理。 4. 自定义内嵌容器配置:Spring Boot默认使用Tomcat作为内嵌容器,但你也可以通过自定义配置来切换到其他容器,如Jetty或Undertow。可以通过创建一个继承自`EmbeddedServletContainerCustomizer`的Bean来实现对内嵌容器的定制。 5. 自定义错误页面:Spring Boot可以根据错误状态码自动显示错误页面,但你也可以自定义错误页面,以提供更好的用户体验。可以创建一个继承自`ErrorController`的Controller来处理错误请求,并指定对应的错误页面。 这些只是自定义组件的一些常见示例,你可以根据自己的需求进一步扩展和定制。在实际开发中,你可以根据具体场景选择需要自定义的组件,并按照Spring Boot的规范进行实现和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值