事务的隔离级别和锁机制:

  READ UNCOMMITTED(未提交读)

    在这个级别,事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据。(不加锁或只加共享锁)

  READ COMMITTED(提交读)

    一个事务开始时,只能“看见”已经提交的事务所做的修改。也就是一个事务从开始直到提交前,所做的任何修改对其他事务都是不可见的。(对行记录加排它锁)

  REPEATABLE READ(可重复读)     MySQL数据库默认的隔离级别

    一个事务在执行过程中可以看到其他事务已经提交的新增(删除)的数据,但是不能看到其他事务对已有记录的更新。可重复读解决了“脏读”的问题,但是有“幻读”的问题,

    InnoDB和XtraDB存储引擎通过MVCC解决了幻读的问题。(对符合条件的记录加区间锁)

  SERIALIZABLE(可串行化)    ORACLE数据库默认的隔离级别

    一个事务在执行过程中完全看不到其他事务对数据库所做的更新,当两个事务同事操作数据库中相同的数据时,如果第一个事务已经在访问该数据,第二个事务只能停下

    来等待,必须等到第一个事务执行完毕后才能够进行。最高的隔离级别,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁竞争的问题。(对整个表加锁)

                          

  1. MySQL可以通过执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别。新的隔离级别会在下一个事务开始的时候生效。

  2. 也可以改变当前回话的隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

  3. MySQL服务器层不管理事务,事务是由下层存储引擎实现的。

事务设置的相关命令:

  1、查看当前会话的隔离级别:select @@tx_isolation;

  2、查看系统当前隔离级别:select @@global.tx_isolation;

  3、设置当前会话隔离级别:set session transaction isolation level repeatable read;

  4、设置当前系统隔离级别:set global transaction isolation level repeatable read;

  5、查看和设置mysql自动提交:show VARIABLES like 'autocommit';  set autocommit=off;

脏读:

  允许事务B读到了事务A未提交的数据,可能就造成了脏读,脏读的本质就是无效的数据,只有当事务A回滚,那么事务B读到的数据才为脏数据,所以这里只是可能造成脏读。如果事务A不回滚,事务B读到的数据就不为脏数据,也就是有效的数据。

不可重复读:

  不可重复读是指在一个事务范围中2次或者多次查询同一数据M返回了不同的数据,例如:事务B读取某一数据,事务A修改了该数据M并且提交,事务B又读取该数据M(可能是再次校验),在同一个事务B中,读取同一个数据M的结果集不同,这个很蛋疼

                        

幻读:

  当用户读取某一个范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现会有新的“幻影行”,例如:事务B读某一个数据M,事务A对数据M增加了一行并提交,事务B又读数据M,发生多出了一行造成的结果不一致(如果行数相同,则是不可重复读)。

                        

丢失更新:

  事务A和事务B,同时获得相同数据,然后在各自的事务中修改数据M,事务A先提交事务,数据M假如为M+,事务B后提交事务,数据M变成了M++,最终结果变成M++,覆盖了事务A的更新。

                        

不可重复读和幻读的区别:

  1、简单来说,不可重复读是由于数据修改引起的,幻读是因为数据增加或者删除引起的。

  2、不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。

  3、所谓幻读,是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。

隐式锁定和显式锁定:

  1.InnoDB采用的是两阶段锁定协议(two-phase locking protocol)。在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT和ROLLBAK的时候才会释放,并且所有的锁是在同一时刻被释放。

  2. LOCK TABLES和事务之间相互影响的话,情况会变得非常复杂,所以除非事务中禁用了AUTOCOMMIT,可以使用LOCK TABLES之外,其他任何时候都不要显示的执行LOCK TABLES,不管使用的是什么存储引擎。

死锁:

  两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源也可能会产生死锁

  例如:

--事务1
START TRANSACTION;
UPDATE price SET close=45.5 WHERE stock_id=4 AND date='2017-10-11';
UPDATE price SET close=19.8 WHERE stock_id=3 AND date='2017-10-12';
COMMIT; --事务2
START TRANSACTION;
UPDATE price SET high=20.12 WHERE stock_id=3 AND data='2017-10-12';
UPDATE price SET high=47.20 WHERE stock_id=4 AND data='2017-10-11';
COMMIT;

  如果凑巧,两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现改行已经被对方锁定,然后两个事务都等待对方释放锁,同时有持有对方需要的锁,则陷入死循环。除非有外部因素接入才可能接触死锁。InnoDB目前处理死锁的方法时,经持有最少行级排他锁的事务进行回滚

InnoDB-MVCC多版本并发控制

事物和索引的关系?

参考:

【1】《高性能MySQL》(第三版), Baron Schwartz等 著,宁海元等 译,电子工业出版社 ,2013

【2】 博客,https://segmentfault.com/a/1190000004469395#articleHeader6

【3】微信,https://mp.weixin.qq.com/s/LlgYXE7oswDJEt5wJhyAwA

mysql-innoDB-事务的更多相关文章

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

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

  2. Mysql InnoDB事务

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

  3. MySql - InnoDB - 事务 , Php版

    (出处:http://www.cnblogs.com/linguanh/) 1,前序 由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式 ...

  4. MySQL InnoDB 事务实现过程相关内容的概述

    MySQL事务的实现涉及到redo和undo以及purge,redo是保证事务的原子性和持久性:undo是保证事务的一致性(一致性读和多版本并发控制):purge清理undo表空间背景知识,对于Inn ...

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

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

  6. MySQL——InnoDB事务

    事务:全部成功 或 全部失败! ------------------------------------------------------------------------------------ ...

  7. mysql innodb事务的ACID及其实现的保证机制

    MySQL事务的ACID,一致性是最终目的.保证一致性的措施有:A原子性:靠undo log来保证(异常或执行失败后进行回滚).D持久性:靠redo log来保证(保证当MySQL宕机或停电后,可以通 ...

  8. MySQL InnoDB四个事务级别 与 脏读、不反复读、幻读

    MySQL InnoDB事务隔离级别脏读.可反复读.幻读 希望通过本文.能够加深读者对ySQL InnoDB的四个事务隔离级别.以及脏读.不反复读.幻读的理解. MySQL InnoDB事务的隔离级别 ...

  9. MySQL InnoDB MVCC

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  10. MySQL InnoDB 实现高并发原理

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

随机推荐

  1. display:box;display:flex;弹性盒模型

    display:box:display:flex:弹性盒模型 非常适用于移动端.PC端高级浏览器,效果也很好. display: -webkit-box; display: -moz-box; dis ...

  2. [Spark性能调优] 第三章 : Spark 2.1.0 中 Sort-Based Shuffle 产生的内幕

    本課主題 Sorted-Based Shuffle 的诞生和介绍 Shuffle 中六大令人费解的问题 Sorted-Based Shuffle 的排序和源码鉴赏 Shuffle 在运行时的内存管理 ...

  3. windows 配置接收报文是否中断

    作用:网络编程的时候,编程接收报文,可以不用循环等待并判断是否报文接收完整.配置了windows禁用网络中端后,自己写的程序一次接收,便是整条报文. 步骤: 1."打开网络和共享中心&quo ...

  4. 如何在 iOS 真机运行 Appium

    使用 gui 启动的 appium 1.2.2 也会有这个问题,所以你要把 deviceconsole 复制到 /Applications/Appium.app/Contents/Resources/ ...

  5. flask-form用户登录与注册

    用户登录 #!/usr/bin/env python # -*- coding:utf- -*- from flask import Flask, render_template, request, ...

  6. 【转载】ipcs与Linux共享内存

    一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要 ...

  7. ComboBox 中 DisplayMember 和 ValueMember 都是具体干什么的?

    ComboBox组件的数据绑定,在得到数据集后,只有设定好ComboBox组件的的三个属性就可以完成数据绑定了,这三个属性是:"DisplayMember". "Valu ...

  8. 富文本编辑器Quill的使用

    我们经常需要使用富文本编辑器从后台管理系统上传文字,图片等用于前台页面的显示,Quill在后台传值的时候需要传两个参数,一个用于后台管理系统编辑器的显示,一个用前台页面的显示,具体代码如下截图: 另Q ...

  9. python 版本管理工具 pyenv 使用备忘

    安装步骤 安装 xcode-select 以及 homebrew(前者在安装 git 的时候装过,后者 mac 开发必备无需解释) 安装 pyenv brew install pyenv,用 pyen ...

  10. java_web学习(三) eclipse_jsp学习

    1.首先打开eclipse,新建一个Dynamac web project项目文件 2.在WebContent单击右键创建JSP File 3.过程 4.简单的jsp代码 运行结果: 5.导出war文 ...