在事务并行处理背景下,不同的事务之间因数据共享的状态变化,存在着某种依赖/隔离影响。即事务隔离级别。

事务隔离级别,官网的解释在这里

InnoDB提供 SQL:1992 标准描述的所有四种事务隔离级别: READ UNCOMMITTED、 READ COMMITTED、 REPEATABLE READ和 SERIALIZABLE。
InnoDB默认的隔离级别是 REPEATABLE READ。

READ UNCOMMITTED(未提交读):即一个事务可以读到另一个事务未提交的“中间状态”数据。也叫脏读。好比A和B在画画,A想看看B的绘画结果,

但是B还没画完,A就拍照走了。实际B的画没有完成;A只是拿了一个中间状态。

READ COMMITTED(提交读):即一个事务不可读到另一个事务未提交的“中间状态”数据。可以避免脏读。但是会发生两次读到的数据不一致问题。

也叫不可重复读。还是A和B画画举例,A在B画画之前读一次,B画完后读一次。A读了两次读到了不同的内容(想当然)。

REPEATABLE READ(可重复读):对不可重复读的改进(可以看到改进在一条条升级)。即两次读到的内容一致。举例来说,即A开始读B的画,

B即交笔停笔不允许改了。不管A读几次结果都一样。直到A结束他的读(事务)。

可重复读仍会产生幻读问题。

幻读这里有点绕,和不可重复读有点像。都是两次读到了不同的结果。不同的是:不可重复读强调查询结果的值的改变,幻读强调查询结果的范围出现了变化,

比如某行数据上一次查询没有,这一次突然出现--这是幻读问题。

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

SERIALIZABLE(可串行化):强制事务进行排序,将并行事务改串行,可以解决脏读,不可重复读,幻读的问题,但是需要加锁。不是很友好。

上面介绍了四种事务隔离级别和各隔离级别仍存在的问题,需要注意的是:READ UNCOMMITTED这种最低一级的隔离级别,相当于没有隔离,

实际应用中基本上不会用。SERIALIZABLE隔离级别会对每一行数据进行读写加锁,可能导致大量的超时和锁争用问题,实际应用中也很少用这个

隔离级别,除非接受没有并发,但我们也知道,基本不可能。

所以我们更多的讨论的是READ COMMITTED和REPEATABLE READ这两个事务隔离级别。

即在READ COMMITTED和REPEATABLE READ这两个事务隔离级别下,如何解决不可重复读和幻读的问题?

通过锁机制和MVCC。其中锁主要处理当前读相关问题,MVCC处理快照读相关问题。

mysql锁的分类 InnoDB Locking

根据锁的覆盖范围,重点关注:表锁,行锁,间隙锁,临键(next-key)锁

MVCC部分待续。

附录总结一

**mysql事务(ACID)的实现原理:

原子性(Atomicity): undo log

一致性(Consistency):一致性是目的,原子性、隔离性、持久性是手段。实现AID三大特性才有可能实现一致性。

隔离性(Isolation): 写写:锁(行锁,表锁,间隙锁);写读:MVCC

持久性(Durability):redo log

MySQL-(InnoDB)事务和锁的更多相关文章

  1. 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现

    Reference:  http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...

  2. MySQL的事务和锁

    MySQL的事务和锁   阅读目录 什么是事务 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再 ...

  3. MySql InnoDB中的锁研究

    # MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...

  4. Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁

    Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...

  5. 搞懂MySQL InnoDB事务ACID实现原理

    前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...

  6. MySQL/InnoDB中,对于锁的认识

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  7. 【译文】MySQL InnoDB 使用的锁分析

    InnoDB 使用的 锁类型 共享锁和排它锁 意向锁 记录锁 间隙锁 Next-key 锁 插入意向锁 AUTO-INC 锁 共享锁和排他锁 InnoDB实现了俩个标准的行级锁,共享锁和排它锁. 共享 ...

  8. InnoDB事务和锁

    InnoDB支持事务,MyISAM不支持事务. 一.事务的基本特性 ACID特性 1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 2.一致性( ...

  9. Mysql InnoDB事务

    http://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html 事务的四个特性 1.原子性(atomicity)原子性是指整个数据库事务是 ...

  10. 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)

    这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...

随机推荐

  1. 服务器安装node

    卸载步骤[未安装请忽略] 1.卸载npm sudo npm uninstall npm -g 2.卸载node yum remove nodejs npm -y 安装步骤 1.下载 wget http ...

  2. 论 C++、C语言中指针的实用价值(一)

    指针的价值在于哪里?单纯为了迷惑别人?其实并非如此.本系列长期总结一些必须用指针或者用指针很好的场合: 写任何的代码都必须有一定的动机.而不是想怎么写就怎么写 写代码不是纯灵感的行为.也不是纯机械的行 ...

  3. ubuntu手动创建快捷方式

    新建document,重命名为XXX.desktop,打开文件 以sublime为例,填写 [Desktop Entry] Version=1.0 Type=Application Name=Subl ...

  4. unidbgrid显示图片

    column设置imageoptions属性,visible=true,设置width

  5. [BUUCTF]HCTF 2018WarmUp1 write up

    ctrl+U查看源代码, 如下: 访问提示中的source.php文件 发现显示了源码,且存在另一个PHP文件hint.php(提示.php),先查看文件内是否有信息 用file来传参,并且要绕过wh ...

  6. Winform 使用DotNetBar 设置界面为Office2007 样式

    public partial class FrmMain : DevComponents.DotNetBar.Office2007RibbonForm { public FrmMain() { Ini ...

  7. layui tree 未命名 所遇到的坑

    由于传入类型不对,需要传入object类型,我传入的是String类型,所以出现了 一堆未命名, 在控制台输出查看,是一模一样的,困扰了我一下午,再次感谢老哥 参考自:https://www.cnbl ...

  8. RecyclerView显示列表

    本次要讲的内容是利用RecyclerView显示Users列表的信息,如下图所示. 首先我们来创建模型User.java package com.example.mytest.User; import ...

  9. Kotlin 基础

    Kotlinbase.kt @file:JvmName("kotlinbaseTest") import kotlin.math.roundToInt as atoInt fun ...

  10. nginx配置反向代理服务器,实现在https网站中请求http资源

    网站使用nginx作为服务器,协议从http升级为https的注意事项. 具体升级步骤请点击搜索 1.首先,修改宝塔面板配置 选择配置文件,http请求重定向为https.所有80端口请求都重定向为h ...