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

  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. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  2. Python进阶内容(三)--- reduce

    描述 functools.reduce() 函数会对参数序列中元素进行累积.函数将一个数据集合(列表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集 ...

  3. Linux常用命令之文件处理命令

    注:由于Linux操作系统有些目录不能轻易操作,特此建议大家在家目录home,或root.tmp目录下练习命令,以免带来不必要的损失 一.查询目录中的内容:ls 命令格式:ls [选项] [文件或目录 ...

  4. 4.variables

    变量在python可以是字符也可以是数字.例如:   x = 2 price = 2.5 word = 'Hello'   变量名在等号左边,值在右边,一旦变量被指定,就可以在程序的其他地方使用它. ...

  5. JMeter-自动生成测试报告

    很多朋友都在问jmeter如何生成测试报告,这里随便说两句. 环境要求 1:jmeter3.0版本之后开始支持动态生成测试报表 2:jdk版本1.7以上 3:需要jmx脚本文件 基本操作 1:在你的脚 ...

  6. HTML元素分类【三种类型】

      在CSS中,html中的标签元素大体被分为三种不同的类型: 块状元素.内联元素(又叫行内元素)和内联块状元素. 块状元素:display:block内联元素:display:inline 内联块状 ...

  7. shiro真正项目中的实战应用核心代码!!!

    欢迎转载!!!请注明出处!!! 说道shiro的学习之路真是相当坎坷,网上好多人发的帖子全是简单的demo样例,核心代码根本没有,在学习过程中遇到过N多坑. 经过自己的努力,终于整出来了,等你整明白之 ...

  8. ECJTUACM16 Winter vacation training #5 题解&源码

    A------------------------------------------------------------------------------------------- 题目链接:ht ...

  9. C++面向对象作业1

    #include <iostream> #include <stdlib.h> using namespace std; class Tdate { public: Tdate ...

  10. ACM中常见错误对应表

    因为经常写错题,找了个这个看看... 传送门:http://www.cnblogs.com/ZouCharming/p/3868844.html 我太垃圾了... 我出现过的错误: Wrong Ans ...