当前位置: 首页 > news >正文

Spring事务和事务传播机制

目录

Spring中事务的实现

1、通过代码的方式手动实现事务

2、通过注解的方式实现声明式事务

2.1、@Transactional作用范围

2.2、@Transactional参数说明

2.3、注意事项

2.4、@Transactional工作原理

事务隔离级别

1、事务特性

2、Spring中设置事务隔离级别

2.1、MySQL事务隔离级别 

2.2、Spring事务隔离级别

Spring事务传播机制

spring事务传播机制分类

1、Propagation.REQUIRED

2、Propagation.SUPPORTS

3、Propagation.MANDATORY

4、Propagation.REQUIRES_NEW

5、Propagation.NOT_SUPPORTED

6、Propagation.NEVER

7、Propagation.NESTED


Spring中事务的实现

1、通过代码的方式手动实现事务

    @Autowired
    private DataSourceTransactionManager transactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;


    //1、开启事务
    TransactionStatus transactionStatus=transactionManager.getTransaction(transactionDefinition);

    //手动设置创建时间和修改时间的默认值
    userinfo.setCreatetime(LocalDateTime.now().toString());
    userinfo.setUpdatetime(LocalDateTime.now().toString());


    //2、回滚事务
    //transactionManager.rollback(transactionStatus);

    //3、提交事务
    transactionManager.commit(transactionStatus);

2、通过注解的方式实现声明式事务

@Transactional

1、可以添加在类上或方法上

2、在方法执行前自动开启事务,在方法执行完(没有任何异常)自动提交事务,但是如果在方法执行期间出现异常,那么将自动回滚事务

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(Userinfo userinfo){
        //非空效验
        if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return 0;
        }
        int result= userService.add(userinfo);
        System.out.println("添加:"+result);
        return result;
    }

2.1、@Transactional作用范围

修饰方法时:只能用到public方法上,否则不生效

修饰类时:表明该注解对该类中所有的public方法都生效

2.2、@Transactional参数说明

参数

说明

value当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。
transactionManager当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器.
propagation事务的传播行为默认值为Propagation.REQUIRED
isolation事务的隔离级别,默认值为Isolation. DEFAULT
timeout事务的超时时间,默认值为-1如果超过该时间限制但事务还没有完成则自动回滚事务.
readOnly指定事务是否为只读事务默认值为false;为了忽略那些不需要事务的方法比如读取数据,可以设置read-only为true.
rollbackFor用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。
rollbackForClassName用于指定能够触发事务回滚的异常类型,可以指定多个异常类型.
noRollbackFor抛出指定的异常类型不回滚事务,也可以指定多个异常类型
noRollbackForClassName抛出指定的异常类型.不回滚事务,,也可以指定多个异常类型

2.3、注意事项

当程序中有try-catch。及时程序发生异常,事务也不会回滚

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(Userinfo userinfo){
        //非空效验
        if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return 0;
        }
        int result= userService.add(userinfo);
        System.out.println("添加:"+result);
        try {
            int num=10/0;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

解决方法:

1、将异常抛出去

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(Userinfo userinfo){
        //非空效验
        if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return 0;
        }
        int result= userService.add(userinfo);
        System.out.println("添加:"+result);
        try {
            int num=10/0;
        } catch (Exception e) {
            //将异常继续抛出
            throw e;
        }
        return result;
    }

2、使用代码手动回滚事务

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2.4、@Transactional工作原理

事务隔离级别

1、事务特性

原子性

一致性

持久性

隔离性

2、Spring中设置事务隔离级别

2.1、MySQL事务隔离级别 

事务隔离级别脏读不可重复读幻读
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)×
可重复读(REPEATABLE READ)××
串行化(SERIALIZABLE)×××

2.2、Spring事务隔离级别

1. Isolation.DEFAULT: 以连接的数据库的事务隔离级别为主。

2. Isolation.READ. _UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。

3. Isolation.READ. COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。

4. Isolation.REPEATABLE READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。

5. Isolation.SERIALIZABLE: 串行化,可以解决所有并发问题,但性能太低。

通过设置@Transactional里的isolation属性即可 

Spring事务传播机制

spring事务传播机制分类

1、Propagation.REQUIRED

默认传播机制,如果调用链存在事务,则加入事务,如果不存在则创建事务

2、Propagation.SUPPORTS

如果调用链存在事务,则加入事务;如果不存在则非事务方式运行

3、Propagation.MANDATORY

强调必须有事务

4、Propagation.REQUIRES_NEW

5、Propagation.NOT_SUPPORTED

6、Propagation.NEVER

7、Propagation.NESTED

嵌套事务和加入事务的区别:

1、整个事务如果全部执行成功,二者的结果是一样的;

2、如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部会滚,不会影响上一个方法中执行的结果

相关文章:

  • ChatGPT加强版GPT-4面世,打工人的方式将被颠覆
  • oracle和mysql的区别
  • 指针进阶(上)
  • C++ 手撸简易服务器(完善版本)
  • string类(上)
  • SpringCloud五大核心组件
  • IntelliJIDEA 常用快捷键
  • 【2024考研】计算机考研,4轮复习时间安排
  • js类型转换
  • 一天吃透TCP面试八股文
  • 美团笔试-3.18
  • python 内置函数和多线程
  • 嵌入式学习笔记——STM32的时钟树
  • GPT-4最震撼我的一点
  • FPGA纯verilog实现RIFFA的PCIE通信,提供工程源码和软件驱动
  • Angular数据绑定机制
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker 笔记(2):Dockerfile
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • GitUp, 你不可错过的秀外慧中的git工具
  • input的行数自动增减
  • Java多线程(4):使用线程池执行定时任务
  • java取消线程实例
  • JS函数式编程 数组部分风格 ES6版
  • React as a UI Runtime(五、列表)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 创建一个Struts2项目maven 方式
  • 大整数乘法-表格法
  • 深入浏览器事件循环的本质
  • 温故知新之javascript面向对象
  • 移动端 h5开发相关内容总结(三)
  • 怎样选择前端框架
  • 进程与线程(三)——进程/线程间通信
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #Z2294. 打印树的直径
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net IE10 _doPostBack 未定义
  • .Net mvc总结
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @javax.ws.rs Webservice注解
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ARM]ldr 和 adr 伪指令的区别