• 【快学springboot】9.使用 @Transactional 注解配置事务管理


    介绍

    springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。

    使用Transactional注解

    Transactional注解使用起来是非常简单的,只需要在相应的方法上面标识Transactional注解即可。

    下面通过一个简单的例子演示Transaction注解的使用

    @Transactional
    @Override
    public void addUser() {
     User user1 = new User();
     user1.setUsername("happyjava1");
     user1.setPassword("123456");
     userRepo.save(user1);
     int i = 1 / 0;
     User user2 = new User();
     user2.setUsername("happyjava2");
     user2.setPassword("123456");
     userRepo.save(user2);
    }
    

    这里保存两个用户,然后通过 1/0 的方式使程序出现异常。通过一个测试方法测试:

    @Test
    public void testTx() {
     userService.addUser();
    }
    

    如果数据库没有user1这条记录,说明事物是起作用了的。

    【快学springboot】使用 @Transactional 注解配置事务管理

    执行结果是预期的报错了。

    【快学springboot】使用 @Transactional 注解配置事务管理

    数据库也没有jappyjava1这个字段。说明Transactional注解起作用了。

    Transactional注解通过noRollbackFor配置不回滚的异常

    Transactional注解可以配置发生某个异常时不进行回滚。比如我在Transaction注解上添加如下属性,指定ArithmeticException不进行事务的回滚。

    @Transactional(noRollbackFor = ArithmeticException.class)
    

    再次运行测试方法。

    【快学springboot】使用 @Transactional 注解配置事务管理

    依然报错了,但是查看数据库,user1这条记录已经插入数据库了。

    【快学springboot】使用 @Transactional 注解配置事务管理

    通过propagation属性配置事务的传播行为

    事务的传播行为,默认值为 Propagation.REQUIRED。可以手动指定其他的事务传播行为,如下:

    • Propagation.REQUIRED

    如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

    • Propagation.SUPPORTS

    如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

    • Propagation.MANDATORY

    如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

    • Propagation.REQUIRES_NEW

    重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

    • Propagation.NOT_SUPPORTED

    以非事务的方式运行,如果当前存在事务,暂停当前的事务。

    • Propagation.NEVER

    以非事务的方式运行,如果当前存在事务,则抛出异常。

    • Propagation.NESTED

    如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

    通过isolation 属性配置事务的隔离级别

    事务的隔离级别,默认值为 Isolation.DEFAULT,这个跟数据库的隔离级别有关系。可以自定义隔离级别,如下:

    • Isolation.DEFAULT
    • Isolation.READ_UNCOMMITTED
    • Isolation.READ_COMMITTED
    • Isolation.REPEATABLE_READ
    • Isolation.SERIALIZABLE

    事务的传播行为和隔离级别是比较抽象的东西,本文作为springboot的教程课程暂且不做探讨,等后续有时间会再写文章做探讨。

    timeout 属性

    事务的超时时间,默认值为-1。如果设置了该时间,超过该时间限制但事务还没有完成,则自动回滚事务。

    总结

    本文只是介绍了springboot可以通过Transactional注解,快速的配置事务管理。数据库事务,是一个很复杂的东西,如果要讲清楚,就不应该放在一篇springboot相关的文章中进行讲解,后续会再起篇幅,单独讲讲事务相关的东西。

  • 相关阅读:
    如何分析matlab程序的主要效率问题
    matlab的二维卷积操作
    移动,联通,电信手机都属于什么频段?
    开始学习Python
    利用R进行多元线性回归分析
    PANGU---Planet and Asteroid Natural scene Generation Utility
    中兴N909手机关闭照相机声音
    0709 C语言常见误区----------函数指针问题
    0709 C语言常见误区----------二维数组做参数
    0707 父子进程之间传递文件描述符
  • 原文地址:https://www.cnblogs.com/happy4java/p/11205807.html
Copyright © 2020-2023  润新知