当前位置:   article > 正文

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

事务方法调用非事务方法
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();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
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("故意跑出异常");
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/224619
推荐阅读
相关标签
  

闽ICP备14008679号