• 隔离级别


    事务的基本要素(ACID)

      1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

       2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

       3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

       4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

     

    Mysql提供了4中隔离级别,在介绍这4中隔离级别前,先针对涉及的术语进行说明:

      1、脏读:一个事务读取另外一个事务还没有提交的数据叫脏读【针对未提交的数据】

      2、不可重复读:即在同一个事务内,两个相同的查询返回了不同的结果【读取数据本身的对比】

      3、幻读:即解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性),因此同一个事务同样的SELECT操作读到的结果会是一致的,但是,如果另一个事务同时提交了新数据或删除数据,本事务再更新时,就会“惊奇的”发现了这些新增或缺少数据,貌似之前读到的数据是“鬼影”一样的幻觉【同一事务A多次查询,若另一事务B只是update,则A事务多次查询结果相同;若B事务insert/delete数据,则A事务多次查询就会发现新增或缺少数据,出现幻读,即幻读关注读取结果集条数变化】

     

    1、读不提交(Read Uncommited,RU)

      这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用。

    2、读提交(Read commited,RC)

      本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)

    3、可重复读(Repeatable Read,RR)【MySQL 默认的级别】

      在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同一个事务同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象

    4、 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

    事务隔离级别

    脏读

    不可重复读

    幻读

    读未提交(read-uncommitted)

    不可重复读(read-committed)

    可重复读(repeatable-read)

    串行化(serializable)

    隔离级别越高,并发性越差

  • 相关阅读:
    Vue_(组件通讯)父子组件简单关系
    JavaWeb_(Struts2框架)Struts创建Action的三种方式
    JavaWeb_(Struts2框架)Servlet与Struts区别
    Vue_(组件通讯)动态组件结合keep-alive
    Vue_(组件通讯)动态组件
    Vue_(组件通讯)组件
    JavaWeb_(Struts2框架)使用Struts框架实现用户的登陆
    JavaWeb_(Struts2框架)使用Servlet实现用户的登陆
    原生Js_实现广告弹窗
    原生Js_简易图片轮播模板
  • 原文地址:https://www.cnblogs.com/ting-3/p/10622118.html
Copyright © 2020-2023  润新知