zoukankan      html  css  js  c++  java
  • MySQL学习(二)事务的隔离级别

    :规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低

    • read uncommitted(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,被称为脏读(dirty read)
    • read committed(提交读),大部分数据库系统默认的隔离基本是这个,但mysql不是,一个事务开始时,只能"看见"已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
    • repeatable read(可重复读),保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重复度隔离级别还是无法解决另外一个幻读(phantom read)问题,所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(phantom row)。InnoDB存储引擎通过多版本并发控制(mvcc,multiversion concurrency control)解决了幻读的问题。可重复读是mysql默认的事务隔离级别
    • serializable(可串行化):通过强制事务串行执行,避免了前面说的幻读问题。简单来说,会在读取的每一行数据都加上锁。

    多版本并发控制

    可以认为mvcc是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

    mvcc的实现,是通过保存数据在某个时间点的快照来实现的

    innodb的mvcc,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个新的事物,系统版本号就会自动递增。事物开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

    下面看一下在repeatable read隔离级别下,mvcc具体是如何操作的:

    • select,innodb会根据以下两个条件检查每行记录
      • innodb只查找版本早于当前事务版本的数据行(也就是,行的系统版本小于或等于事务的系统版本号),这样可以确保事物读取的行,要么是在事物开始前已经存在的,要么是事务自身插入或者修改过的
    • insert,innodb为新插入的每一行保存当前系统版本号作为行版本号
    • delete,innodb为删除的每一行保存当前系统版本号作为行删除标识
    • update:innodb为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

    保存这两个额外系统版本号,使大多数读操作都可以不用加锁。这样设计使得读数据库操作很简单,性能很好,并且也能保证只会读取到符合标准的行。不足之处是每行记录都需要额外的存储空间,需要做更多的行检查工作,以及一些额外的维护工作。

    mvcc只在repeatable read和read committed两个隔离级别下工作。其他两个隔离级别都和mvcc不兼容,因为read uncommitted总是读取最新的数据行,而不是符合当前事务版本的数据行。而serializable则会对所有读取的行都加锁。

  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/lhxBlogs/p/15659970.html
Copyright © 2011-2022 走看看