隔离级别

MySQL 加锁处理分析

筅森魡賤 提交于 2019-11-29 08:13:34
链接地址: http://hedengcheng.com/?p=771 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景

MySQL 加锁处理分析

荒凉一梦 提交于 2019-11-29 08:13:19
MySQL 加锁处理分析 http://hedengcheng.com/?p=771 MySQL 加锁处理分析 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到 MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思 路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁

mysql InnoDB加锁分析

一笑奈何 提交于 2019-11-29 08:12:52
文章转载自: http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7。 假设已知一张表my_table,id列为主键 id name num 1 aaa 100 5 bbb 200 8 bbb 300 10 ccc 400 1. 查询命中聚簇索引(主键索引) 1.1 如果是精确查询,那么会在命中的索引上加record lock // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id=1; // 在id=1的聚簇索引上加S锁 select * from my_table where id=1 lock in share mode; 1.2 如果是范围查询,那么 1.2.1 在RC隔离级别下,会在所有命中的行的聚簇索引上加record locks(只锁行) // 在id=8和10的聚簇索引上加X锁 update my_table set name='a' where id>7; // 在id=1的聚簇索引上加X锁 update my_table set name='a' where id<=1; 1.2.2 在RR隔离级别下,会在所有命中的行的聚簇索引上加next-key locks(锁住行和间隙)

Mysql的select加锁分析

若如初见. 提交于 2019-11-29 08:12:01
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 本文假定读者,看过我的 《MySQL(Innodb)索引的原理》 。如果没看过,额,你记得三句话吧 innodb一定存在聚簇索引

MySql-事务

时光毁灭记忆、已成空白 提交于 2019-11-29 06:24:09
MySql 非关系型数据库--稳定--开源 事务 逻辑上的一组操作,要么都执行,要么都不执行。 事务的ACID: 原子性(Atomicity) :事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行; 一致性(Consistency) :事务应确保数据库的状态从一个一致状态转变为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束。(应该类似于物理上的能量守恒吧,能量之间互相转换,不会凭空消失与产生); 隔离性(Isolation) :多个事务并发执行时,一个事务的执行不应影响其他事务的执行; 持久性(Durability) :已被提交的事务对数据库的修改应该永久保存在数据库中,宕机也可以恢复。 事务并发所产生的的问题 脏读(Dirty read): A事务读取了B事务未提交的数据,A事务读到的数据就是脏数据。 丢失修改(Lost to modify): A事务与B事务读取同一数据,A事务先对该数据进行修改,B后再进行修改,B修改的结果会对A做的修改进行覆盖,导致A修改的数据丢失。 不可重复读 (Unrepeatableread): A事务开启,在此事务内多次访问某数据,期间B事务对该数据进行了修改,在A事务内两次独读到的该数据可能会不一致。 幻读 (Phantom read):A事务读取了部分数据,B事务又插入了一些数据,A事务再次读取时

MySQL InnoDB存储引擎的事务隔离级别

我的梦境 提交于 2019-11-29 03:34:24
我们知道,在关系数据库标准中有四个事务隔离级别: 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的, InnoDB默认级别 。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 查看InnoDB系统级别的事务隔离级别: mysql> SELECT @@global.tx_isolation; +———————–+ | @@global.tx_isolation | +———————–+ | REPEATABLE-READ | +———————–+ 1 row in set (0.00 sec) 查看InnoDB会话级别的事务隔离级别: mysql> SELECT @@tx_isolation; +—————–+ | @@tx_isolation | +—————–+ | REPEATABLE-READ | +—————–+ 1 row in set (0.00 sec) 修改事务隔离级别: mysql> set global

MySQL MVCC && 事务隔离级别 && 锁

与世无争的帅哥 提交于 2019-11-29 03:34:16
MySQL MVCC && 事务隔离级别 && 锁 InnoDB多版本并发控制——MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySQL_S锁_X锁_read lock_write lock http://my.oschina.net/xinxingegeya/blog/215417 MySQL事务隔离级别 http://my.oschina.net/xinxingegeya/blog/215419 MySQL命令行控制事务 http://my.oschina.net/xinxingegeya/blog/296459 MySQL REPEATABLE-READ && 幻读 http://my.oschina.net/xinxingegeya/blog/296513 MySQL/InnoDB锁机制 http://my.oschina.net/xinxingegeya/blog/296591 MySQL事务隔离级别之REPEATABLE-READ http://my.oschina.net/xinxingegeya/blog/296612 MySQL锁表_LOCK TABLES_UNLOCK TABLES http://my.oschina.net/xinxingegeya/blog/341593 MySQL

MySQL中的锁

孤街醉人 提交于 2019-11-29 02:02:16
MySQL中的锁 https://www.cnblogs.com/chenqionghe/p/4845693.html 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。 MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 表级锁 MySQL表级锁有两种模式:表共享锁(Table Read Lock)和表独占写锁(Table Write Lock) 对MyISAM的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作 MyISAM表的读操作和写操作之间,以及写操作之间是串行的

mysql事务隔离级别与设置

丶灬走出姿态 提交于 2019-11-29 00:08:41
mysql数据库,当且仅当引擎是InnoDB,才支持事务; 1、隔离级别 事务的隔离级别分为: 未提交读 (read uncommitted)、 已提交读 (read committed)、 可重复读 (repeatable read)、 串行化 (serializable)。 未提交读 A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;---出现脏数据 已提交读 A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;---不可重复读 可重复读 A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照; 串行化 不允许读写并发操作,写执行时,读必须等待; 2、数据库设置 //查看当前事物级别: SELECT @@tx_isolation; //设置mysql的隔离级别: set session transaction isolation level 设置事务隔离级别 //设置read uncommitted级别: set session transaction isolation level read uncommitted; //设置read committed级别: set session transaction isolation level read committed; /

MySQL事务问题

筅森魡賤 提交于 2019-11-28 21:40:21
并发事务问题 每个客户端和服务器的一次连接,就是一个会话,而每个客户端可以在自己的会话中发出事务请求,一般来说一个服务器可以连接若干个客户端,所以一个服务器可以同时处理很多事务请求,但理论上某个事务在对某个数据在进行访问时,其他事务应该排队等待。但这样在高并发下会严重影响性能,所以只能设计事务隔离级别来兼顾事务的隔离性和提高多个事务的性能。 事务问题 如果事务执行不保证串行执行,也就是并发执行会遇到以下几个问题: 脏写:一个事务修改了另一个未提交事务修改过的数据 脏读:一个事务读到另一个未提交事务修改过的数据 不可重复读:一个事务能读到其他已提交事务修改过后的值,并且每次其他事务修改并提交,该事务都能查到最新值,但我们其实需要的是第一次读的那个值 幻读:一个事务先根据某些条件查询出一个范围的记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,即读到了之前没有读到的记录 隔离级别 根据这几个问题,SQL标准设计了4个隔离级别,在不同程度上禁止了这些问题的发生。 READ UNCOMMITTED 隔离级别下,可能发生 脏读 、 不可重复读 和 幻读 问题。 READ COMMITTED 隔离级别下,可能发生 不可重复读 和 幻读 问题,但是不可以发生 脏读 问题。 REPEATABLE READ 隔离级别下,可能发生