SpringBoot事务的简单运用

超赞的文章
参考文章1:https://blog.youkuaiyun.com/qq_34337272/article/details/80394121
参考文章2:https://www.cnblogs.com/jinjian91/p/10549125.html
参考文章3:https://blog.youkuaiyun.com/justry_deng/article/details/80828180


通用配置
添加下面依赖,sprongboot 会默认开启事务管理

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

或在启动类添加

@EnableTransactionManagement

开启事务
在这里插入图片描述
一、声明式事务
使用事务:

@Transaction
public void test(String userName){
    //...
}

捕获到异常将自动进行回滚,其只能捕获到运行时异常

spring事务失效的几种场景https://blog.youkuaiyun.com/Jiangbohao_/article/details/107182301

@Transactional 注解参数详解https://blog.youkuaiyun.com/weixin_44259720/article/details/110138972

二、编程式事务
使用事务:
在需要的服务类里添加:

	//事务使用的接口
    @Resource
    DataSourceTransactionManager dataSourceTransactionManager;
    @Resource
    TransactionDefinition transactionDefinition;
//手动开启事务!
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);

//事务回滚
//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
dataSourceTransactionManager.rollback(transactionStatus);
//提交事务
dataSourceTransactionManager.commit(transactionStatus);

伪代码仅供参考:

@Service
public class OrderMainService {

    //事务使用的接口
    @Resource
    DataSourceTransactionManager dataSourceTransactionManager;
    @Resource
    TransactionDefinition transactionDefinition;


    @Resource
    OrderGoodsMapper orderGoodsMapper;
    @Resource
    UserCartMapper userCartMapper;
    @Resource
    GoodsInfoMapper goodsInfoMapper;
    @Resource
    private OrderMainMapper orderMainMapper;

    public CommonResult<Integer> addOrder(OrderData orderData) {

        //手动开启事务!
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);

        //遍历,判断商品库存是否充足
        for (OrderGoods orderGoods : orderData.getOrderGoodsList()) {
            //订购数量
            int goodsCount;
            //查询商品信息
            GoodsInfo goodsInfo;
            //判断物品库存是否充足
            if (goodsInfo.getGoodsRemainCount() - goodsCount >= 0) {
                //更新商品库存信息
                goodsInfo.setGoodsRemainCount(goodsInfo.getGoodsRemainCount() - goodsCount);
                goodsInfoMapper.editGoods(goodsInfo);
            } else {
                //事务回滚
                dataSourceTransactionManager.rollback(transactionStatus);
                //订单中只要有一项商品库存不足就取消订单
                return new CommonResult<>("商品库存不足", null);
            }
        }

        //订单中所有商品库存都足够则更新数据库中商品信息
        //提交事务
        dataSourceTransactionManager.commit(transactionStatus);

        //...
        Integer influence = new Integer(1);
        return new CommonResult<>("success",influence);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值