zoukankan      html  css  js  c++  java
  • 事务不同的隔离级别实现原理

    事务不同的隔离级别实现原理

    一、概述

    MySQL数据库有多种存储引擎:比如:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE等等,最常见的也就是MyISAM和InnoDB了。

    其中MylSAM是MySQL的默认搜索引擎,但是不支持事务,InnoDB支持事务。

    一、AQS原理

    AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。
    AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包

    AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中

    二、排它锁(Exclusive Lock)

    简称x锁,又称写锁、独占锁。

    若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事物不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

    三、共享锁(Share lock)

    共享锁(Share lock),简称S锁,又称读锁,这个锁和之前的排它锁x锁有区别,主要是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排它锁),直到已释放所有共享锁。

    四、InnoDB的四种事务的隔离级别,分别是怎么实现的?

    使用锁机制和MVCC版本控制实现的

    MVCC:

    4.1、读未提交

    这种事务隔离级别下,select语句不加锁

    4.2、串行化

    这种事务的隔离级别下,所有select语句都会被隐式的转化为select ... in share mode。

    这可能导致,如果有未提交的事务正在修改某些行,所有读取这些行的select都会被阻塞住。

    4.3、可重复读

    普通的select使用快照读(snapshot read),这是一种不加锁的一致性读(Consistent Nonlocking Read),底层使用MVCC来实现

    4.4、读已提交

    (1)普通读是快照读;

    (2)加锁的select, update, delete等语句,除了在外键约束检查(foreign-key constraint checking)以及重复键检查(duplicate-key checking)时会封锁区间,其他时刻都只使用记录锁;

    此时,其他事务的插入依然可以执行,就可能导致,读取到幻影记录。

     

    总结

    • 并发事务之间相互干扰,可能导致事务出现读脏,不可重复度,幻读等问题

    • InnoDB实现了SQL92标准中的四种隔离级别

    (1)读未提交:select不加锁,可能出现读脏;

    (2)读提交(RC):普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读;

    (3)可重复读(RR):普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键锁,以防止读取到幻影记录;

    (4)串行化:select隐式转化为select ... in share mode,会被update与delete互斥;

    • InnoDB默认的隔离级别是RR,用得最多的隔离级别是RC

    概括来说,InnoDB实现的RR,通过锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于undo log的版本链、ReadView)等,实现了一定程度的隔离性,可以满足大多数场景的需要。

  • 相关阅读:
    从零开始在阿里云服务器(Ubuntu)上部署Rails应用
    rspec使用
    ubuntu安装和配置SVN
    给asp:DropDownList追加项到顶层显示
    js生成、删除表格方法
    js验证
    GridView和CheckBox连用,实现全选
    javascript;css;firefox;ie;区别
    回调示例
    GridView联合CheckBox实现全选功能[百度空间搜集]
  • 原文地址:https://www.cnblogs.com/gushiye/p/13938778.html
Copyright © 2011-2022 走看看