springboot:事务以及传播特性

参考:https://www.cnblogs.com/kesimin/p/9546225.html

一:启动类加入@EnableTransactionManagement注解(注意springboot(=默认加了,亲测2.1.6版本不加也行)

@SpringBootApplication
@EnableTransactionManagement //开启事务
public class MkBlogApplication {
    public static void main(String[] args)
    {
        SpringApplication.run(MkBlogApplication.class, args);
    }

}

二: @Transactional注解加在需要事务的方法上,我们在保存到数据库后,抛出一个异常,结果会回滚

    @Override
    @Transactional
    public int add(ArticleVo articleVo) {
        Article article = new Article();
        User user  = new User();
        user.setUserId(articleVo.getUserId());
        article.setTitle(articleVo.getTitle());
        article.setContent(articleVo.getContent());
        article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
        article.setUser(user);
        article.setAddUser(articleVo.getUserId());
        article.setAddTime(new Date());

        String cateids =articleVo.getCateIds();
        if (cateids.length() >0){
            String ids=cateids.substring(0,cateids.length()-1);
            article.setCateIds(ids);
        }

        logger.info("cateids",cateids);

        articleResposition.save(article);

        throw new MkException("测试继承之RuntimeException的异常");

        //return 1;
    }

三:接下来,我们测试下事务传播特性,保存文章的方法里面我们调用user服务插入一条用户数据

    @Override
    @Transactional
    public int add(ArticleVo articleVo) {
        Article article = new Article();
        User user  = new User();
        user.setUserId(articleVo.getUserId());
        article.setTitle(articleVo.getTitle());
        article.setContent(articleVo.getContent());
        article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
        article.setUser(user);
        article.setAddUser(articleVo.getUserId());
        article.setAddTime(new Date());

        String cateids =articleVo.getCateIds();
        if (cateids.length() >0){
            String ids=cateids.substring(0,cateids.length()-1);
            article.setCateIds(ids);
        }

        logger.info("cateids",cateids);

        articleResposition.save(article);

        User user1 = new User();
        user1.setEmail("sdsdsds");
        user1.setMobile("13762691578");
        user1.setUserName("张三");
        userService.save(user1);

        //throw new MkException("测试继承之RuntimeException的异常");

        return 1;
    }

添加用户具体代码如下

    @Override
    public User save(User user) {
        userRepository.save(user);

        throw new MkException("测试一番");
        //return userRepository.save(user);
    }

结果:文章表和用户表都不会插入记录

四:接下来我们换一下,保存用户加入事务,保存文章不要事务

    @Override
    public int add(ArticleVo articleVo) {
        Article article = new Article();
        User user  = new User();
        user.setUserId(articleVo.getUserId());
        article.setTitle(articleVo.getTitle());
        article.setContent(articleVo.getContent());
        article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
        article.setUser(user);
        article.setAddUser(articleVo.getUserId());
        article.setAddTime(new Date());

        String cateids =articleVo.getCateIds();
        if (cateids.length() >0){
            String ids=cateids.substring(0,cateids.length()-1);
            article.setCateIds(ids);
        }

        logger.info("cateids",cateids);

        articleResposition.save(article);

        User user1 = new User();
        user1.setEmail("sdsdsds");
        user1.setMobile("13762691578");
        user1.setUserName("张三");
        userService.save(user1);

        //throw new MkException("测试继承之RuntimeException的异常");

        return 1;
    }


    @Override
    @Transactional
    public User save(User user) {
        userRepository.save(user);

        throw new MkException("测试一番");
        //return userRepository.save(user);
    }

 结果是文章会插入一条记录,而user表不会

 

其他的就不演示了

PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
  
  
  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值