zoukankan      html  css  js  c++  java
  • spring事务的理解

    特性

    一致性:业务处理要么都成功,要么都失败,不能部分成功不分失败

    原子性:业务操作是由多个动作完成,这些动作不可分割,要么都执行,要么都不执行

    隔离性:事务间之间要做隔离,不要互相影响

    持久性:操作结果最终都会持久化到持久化存储器中

    说到底都是为了一致性,才引出原子性、隔离性和持久性,之前在知乎看到过一篇比较好的文章(https://www.zhihu.com/question/30272728/answer/72476703)

    配置方式

    编程式事务(xml配置)

    声明式事务(注解配置,@Transactional)

    注意:直接用函数的方式调用是不会触发事务的,需要使用spring的bean调用,比如在当前bean中注入自己

    声明式事务

    传播机制(7种)

    package org.springframework.transaction.annotation;
    
    public enum Propagation {
        // 默认,有事务就加入当前事务中,没有就新建一个事务
        REQUIRED(0),
        // 支持事务,有事务就用事务,没有就不用事务
        SUPPORTS(1),
        // 支持当前事务,没有事务就会抛出异常
        MANDATORY(2),
        // 挂起当前事务,独立开启一个事务,与外层事务不会相互影响
        REQUIRES_NEW(3),
        // 以非事务方式运行,存在事务则将当前事务挂起
        NOT_SUPPORTED(4),
        // 以非事务方式运行,存在事务抛出异常
        NEVER(5),
        // 嵌套事务,没有事务就等同于REQUIRED,有事务就以嵌套事务的方式运行,事务提交由外部事务控制
        NESTED(6);
     
        ...   
    }

    隔离机制(4种)

    package org.springframework.transaction.annotation;
    
    /**
      * 从上到下,数据完整性提升,但支持并发量依次减少
      */
    public enum Isolation {
        // 默认,根据不同数据库的实现
        DEFAULT(-1),
        // 读未提交,存在脏读、不可重复读、幻读问题
        READ_UNCOMMITTED(1),
        // 读已提交(oracle、sqlserver默认),解决了脏读问题,存在不可重复读、幻读问题
        READ_COMMITTED(2),
        // 可重复读(mysql Innodb默认),解决了脏读、不可重复读问题,存在幻读问题
        REPEATABLE_READ(4),
        // 完全串行执行,只要同一个DB,sql完全是串行执行的,即使部署了集群(8080和8081两个节点的sql也是串行执行的)
        SERIALIZABLE(8);
    
        ...
    }

    事务嵌套(详情看代码)

    首先要搞清楚一个问题,就是加不加try catch的问题,如果内层事务throw出去一个异常,外层事务没有try catch,势必也会触发异常,而这个异常可能就是外层事务回滚的条件。

    REQUIRED:内层或外层事务回滚,整个事务都会回滚

    REQUIRED_NEW:内外层事务相对独立,内层事务回滚不影响外层事务,外层回滚不影响内层事务

    NESTED:事务的提交、回滚是由外层事务控制的。内层事务异常回滚会回滚到savepoint(没搞懂怎么配置这个,谁会可以给我留个言),不影响外层事务(需要try catch包住内层事务的函数)外层事务回滚,内层事务也会回滚)

    测试代码

    https://gitee.com/wlyfree/transaction

  • 相关阅读:
    正则表达式30分钟入门教程
    解读C#中的正则表达式1
    web开发技巧经验积累
    常用效果的实现(Javascript的子父页访问、函数调用)
    document.execCommand()编程
    把任意文件隐藏在一张图片里
    在C#中如何实现Form与Form之间的通信
    全国各个省市数据库
    对长时间装载的ASP.NET页如何在客户端浏览器中显进度
    关于UPC E条码的校验
  • 原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/9322413.html
Copyright © 2011-2022 走看看