zoukankan      html  css  js  c++  java
  • 数据库四种事务隔离级别大致理解

    1、ACID

      A:原子性:一个事务中的每个操作,要么都做要么都不做,不会在事务结束后有的做了有的没做。

      C:一致性:一个事务的始末应该对数据库的完整性没有破坏。比如转账问题,A转出帐,B不能没收到。

      I:隔离性:同一时间一个事务操作一个数据,另一个事务不能操作这个数据。

      D:持久新:事务处理后的数据应该进行持久化处理,存储到硬盘中,而不是依然在内存里。

    2、事务并发时候出项的三种问题

      1、脏读:A事务对数据进行修改的过程中,B事务读取该数据,A事务对该数据进行回滚,那么B事务读到了脏数据。

      2、不可重复读:A事务多次读取一个数据,在此过程中,B事务对该数据进行了修改并进行了提交,导致A事务读取同一数据时却读到了不同数值。

      3、幻读:A事务对一类数据进行修改过程中,B事务插入(删除)一条数据,A结束修改后才发现多(少)了一条数据。

      脏读和不可重复读区别:脏读是在另一个事务提交之前查到不一致数据的;不可重复读是在另一个事务提交之后查到不一致数据的。解决脏读的方法是修改隔离级别为读未提交以上级别;解决不可重复读的方法是锁住要修改的行。

      不可重复度和幻读区分:不可重复读侧重于修改;幻读侧重于新增和删除。解决不可重复度的方法是锁住要修改的行,而幻读需要锁住整张表。

    3、事务的四种事务隔离级别(从松到严)以及对应的问题

        隔离级别      脏读       不可重复读    幻读

      1、读未提交          是      是        是

      2、读已提交            否      是        是

      3、可重复读       否      否           是

      4、串行化        否      否           否

      mysql默认的隔离级别是可重复读

    4、设置当前的事务隔离级别

      set session transaction isolation level (read uncommited、read commited、repeatable read、serializable)

    5、MVCC多版本并发控制(只是一种机制,可以替代行锁减少开销)

      各种引擎都不是独立使用行锁的,如果使用行锁的话开销较大,一般使用MVCC来代替锁机制。

      innodb会在每行数据后添加隐藏的两列,一个是创建时间(版本号),一个是删除时间(版本号)

      每次事务都会增加一次版本号。

      查询只能查到两种条件的数据:1、只能查询到比查询时的事务版本号低的数据,这样可以有效避免不可重复读和幻读。

                    2、删除版本号要么未定义,要么比查询版本号要高,这样可以保证在查询前数据还没有被删除。

      这样可以解决的是读写冲突,比如幻读,不可重复读这样的隔离性问题。

      但是两个事务,A事务update数据后没有提交,B事务也去update同一个数据后提交,然后A事务也提交,那么B事务提交的数据信息就丢失了。无法解决写写冲突。

    6、OCC乐观并发控制

      用来解决写写冲突的无锁并发控制机制。在一个事务修改数据 提交后,需要查看期间有没有新的提交,没有就提交,有就放弃并重试。

    一般可以使用MVCC配合OCC可以解决两种冲突。

  • 相关阅读:
    vi文本编辑器常用指令功能
    如何利用U盘进行重装win10系统(2020.11亲测可行)
    技术文档:用户和文件权限管理
    把树莓派变身无线AP
    循环控制结构程序03 零基础入门学习C语言18
    循环控制结构程序03 零基础入门学习C语言18
    循环控制结构程序01 零基础入门学习C语言16
    循环控制结构程序04 零基础入门学习C语言19
    循环控制结构程序01 零基础入门学习C语言16
    循环控制结构程序02 零基础入门学习C语言17
  • 原文地址:https://www.cnblogs.com/television/p/11140034.html
Copyright © 2011-2022 走看看