非事务方法和事务方法互相调用及事务传播行为

package com.example.demoge.controller;

import com.example.demoge.service.TCouponInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author zengqifeng
 * @Description:
 * @date 2020/8/29
 */
@RestController
@RequestMapping("/transactionalTest")
@Api(tags = "事务传播级别及非事务方法和事务方法之间的互相调用")
public class TransactionalTestController {

    @Autowired
    private TCouponInfoService tCouponInfoService;

    /**
     * 测试非事务方法调用事务方法  是否会启动事务
     * 同一个service
     * 1、非事务方法调用事务方法  没有开启事务
     * 2、事务方法调用事务方法(默认传播级别)  两个方法全部回滚(在同一个事务中)
     * 3、事务方法调用非事务方法    两个方法全部回滚(在同一个事务中)
     * 总结:
     * 1、同一个service不存在事务的传播级别  因为下层被调用方法根本不会开启事务
     * 2、同一个service 一个方法(事务或非事务)调用另一个事务方法
     * 第二个事务方法没有代理对象为其生成事务,所以不会开启事务,也不会有事务传播级别的这样说法
     *
     * 不同service
     * 1、非事务方法调用事务方法  第二个方法(其他service的方法)开启了事务
     * 2、事务方法调用事务方法(默认传播级别)  两个方法全部回滚(在同一个事务中)
     *      propagation = Propagation.REQUIRES_NEW
     *      1、全部开启新事物
     *      2、内部事务出现异常  回滚  会导致外部事务也回滚
     *      3、内部事务提交后   及时外部事务出现异常回滚,但并不会导致内部事务的回滚
     * 3、事务方法调用非事务方法    两个方法全部回滚(在同一个事务中)
     * 总结:事务传播级别有效的前提是   方法事务被开启
     * 被调用方事务传播行为有效的前提是   存在调用方
     *
     * @return
     */
    @ApiOperation("新增/编辑券信息")
    @PostMapping("testTransactional")
    public Object testTransactional() {
        return tCouponInfoService.testTransactional();
    }
}

package com.example.demoge.service.impl;

import com.baomidou.mybatisplus.plugins.Page;
import com.example.demoge.entity.TCouponInfo;
import com.example.demoge.mapper.TCouponInfoMapper;
import com.example.demoge.service.TCouponApplyDetailService;
import com.example.demoge.service.TCouponInfoService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 * 优惠券基础信息表 服务实现类
 * </p>
 *
 * @author zengqifeng
 * @since 2020-08-03
 */
@Service
public class TCouponInfoServiceImpl extends ServiceImpl<TCouponInfoMapper, TCouponInfo> implements TCouponInfoService {

    @Autowired
    private TCouponInfoMapper tCouponInfoMapper;

    @Autowired
    private TCouponApplyDetailService tCouponApplyDetailService;

    @Override
    public TCouponInfo demo(Integer id) {
        TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(id);
        tCouponInfoMapper.selectList(null);
        return tCouponInfo;
    }

    @Override
    public List<TCouponInfo> selectPageList(Page page) {
        return tCouponInfoMapper.selectPageList(page);
    }

    /**
     * 测试非事务方法调用事务方法  是否会启动事务
     * 同一个service
     * 1、非事务方法调用事务方法  没有开启事务
     * 2、事务方法调用事务方法(默认传播级别)  两个方法全部回滚(在同一个事务中)
     * 3、事务方法调用非事务方法    两个方法全部回滚(在同一个事务中)
     * 总结:
     * 1、同一个service不存在事务的传播级别  因为下层被调用方法根本不会开启事务
     * 2、同一个service 一个方法(事务或非事务)调用另一个事务方法
     * 第二个事务方法没有代理对象为其生成事务,所以不会开启事务,也不会有事务传播级别的这样说法
     *
     * 不同service
     * 1、非事务方法调用事务方法  第二个方法(其他service的方法)开启了事务
     * 2、事务方法调用事务方法(默认传播级别)  两个方法全部回滚(在同一个事务中)
     *      propagation = Propagation.REQUIRES_NEW
     *      1、全部开启新事物
     *      2、内部事务出现异常  回滚  会导致外部事务也回滚
     *      3、内部事务提交后   及时外部事务出现异常回滚,但并不会导致内部事务的回滚
     * 3、事务方法调用非事务方法    两个方法全部回滚(在同一个事务中)
     * @return
     */
    @Override
    @Transactional
    public Object testTransactional() {
        TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
        tCouponInfo.setId(null);
        tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "001");
        //外部事务
        tCouponInfoMapper.insert(tCouponInfo);
        //insert();
        //内部事务
        tCouponApplyDetailService.inserttest();
        //外部事务  会跑出异常  某个字段值重复
        tCouponInfoMapper.insert(tCouponInfo);
        return null;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insert() {
        TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
        tCouponInfo.setId(null);
        tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "002");
        tCouponInfoMapper.insert(tCouponInfo);
        throw new RuntimeException("故意跑出异常");
    }

}

package com.example.demoge.service.impl;

import com.example.demoge.entity.TCouponApplyDetail;
import com.example.demoge.entity.TCouponInfo;
import com.example.demoge.mapper.TCouponApplyDetailMapper;
import com.example.demoge.mapper.TCouponInfoMapper;
import com.example.demoge.service.TCouponApplyDetailService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 * 优惠券申请详情表 服务实现类
 * </p>
 *
 * @author zengqifeng
 * @since 2020-08-03
 */
@Service
public class TCouponApplyDetailServiceImpl extends ServiceImpl<TCouponApplyDetailMapper, TCouponApplyDetail> implements TCouponApplyDetailService {

    @Autowired
    private TCouponInfoMapper tCouponInfoMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void inserttest() {
        TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
        tCouponInfo.setId(null);
        tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "002");
        tCouponInfoMapper.insert(tCouponInfo);
    }
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值