zoukankan      html  css  js  c++  java
  • 【快学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相关的文章中进行讲解,后续会再起篇幅,单独讲讲事务相关的东西。

  • 相关阅读:
    安全编码1
    VPP tips
    VPP概述汇总
    C语言安全编码摘录
    TCP-proxy
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.4. Matplotlib: plotting
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.3. NumPy: creating and manipulating numerical data
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.1. Python scientific computing ecosystem
    25马5跑道,求最快的五匹马的需要比赛的次数
  • 原文地址:https://www.cnblogs.com/happy4java/p/11205807.html
Copyright © 2011-2022 走看看