MySQL InnoDB Lock(一)

MySQL InnoDB Lock主要从5个部分介绍,这篇文章介绍前2部分,下一篇会详细介绍后3部分。


  • 数据库数据一致性
  • InnoDB事物一致级别
  • InnoDBLock基础知识
  • RR一致级别下SQL对应InnoDBLock情形
  • InnoDBLock定位分析

数据库数据一致性

u 脏读:dirty read,事物A读取到事物B未提交的事物。不符合一致性。

u 不可重复读:事物A读取数据,事物B读取到此数据并且更新此数据,事物A为了对读取数据进行检验再次读取数据时,2次读取获得不同的数据。在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

u 幻读:phantonread,事物A读取到事物B新增、删的数据。(增加读取范围的lock)select ... for update。事务A读取与搜索条件相匹配的若干行,事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

InnoDB事物一致级别

u read uncommitted:RU,读未提交(存在脏读)。事物A读取到事物B未提交的事物。

set globaltransaction isolation level read uncommitted;
set sessiontransaction isolation level read uncommitted;
transaction-isolation=read-uncommitted
select@@global.tx_isolation;
select@@session.tx_isolation;

u read committed:RC,读已提交(存在不可重复读、幻读)。事物A读取事物B已经提交的事物。 ----Oracle提供的事物隔离级别

set global transaction isolation level read committed;

互联网业务一般采用此事物隔离级别。

u repeatable read:RR 可重复读,存在“幻读”可能。 -----MySQL缺省的事物隔离级别

set global transaction isolation level repeatable read;

交易性事物,建议使用此事物隔离级别。 MySQL RR级别,通过Next-Key index解决“幻读”问题。

u serializable:串行化。

set global transaction isolation level serializable;

读增加了表级的Share Lock,更新增加了表级的ExclusiveLock。

1. RU的脏读:session A没有提交,sessionB就可以看到结果

2.RC的不可重复读:session A更新数据,session B两次读取数据不同

3.RC幻读:session A插入数据,session B的结果集被修改了,好像产生了幻觉

4. RR的可重复读:session A 事物执行更新操作,session B事物查看结果不一样,只有session A执行一个完整事物后,session B才能看到同样结果。

5. RR的不幻读

6. 串行化的表级S和X lock

未完待续,下一篇将结合隔离级别分析锁机制,请持续关注


原文发布于微信公众号 - MYSQL轻松学(learnmysql)

原文发表时间:2016-09-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

细谈Select,Poll,Epoll阻塞 io 模型 blocking IO非阻塞 io 模型 nonblocking IOio多路复用模型 IO multiplexing细谈 io 多路复用技术

而根据这两个阶段而不同的操作方法,就会产生多种io模型,本文只讨论select,poll,epoll,所以只引出三种io模型。

441
来自专栏架构师之路

浅谈CAS在分布式ID生成方案上的应用 | 架构师之路

近几篇文章聊CAS被骂得较多,今天还是聊CAS,谈谈CAS在一种“分布式ID生成方案”上的应用。 所谓“分布式ID生成方案”,是指在分布式环境下,生成全局唯一I...

3744
来自专栏Kevin-ZhangCG

什么是死锁?死锁发生的四个必要条件是什么?如何避免和预防死锁产生?

1495
来自专栏撸码那些事

【眼见为实】数据库并发问题 封锁协议 隔离级别

此篇博客是【眼见为实】系列的第一篇博客,主要从理论上讲了数据库并发可能会出现的问题,解决并发问题的技术——封锁,封锁约定的规则——封锁协议。然后简单说明了数据库...

26611
来自专栏架构师之路

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一、需求缘起 上一篇《缓存架构设...

45910
来自专栏Java学习网

Java 实现线程死锁

Java 实现线程死锁 概述 春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Synchronized关...

2216
来自专栏Java Edge

zookeeper分布式锁1 分布式锁的概念与数据最终不一致性的场景zookeeper分布式锁小结

随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式...

1131
来自专栏IT技术精选文摘

分布式事务原理与实践

事务简介 事务的核心是锁和并发,采用同步控制的方式保证并发的情况下性能尽可能高,且容易理解。这种方式的优势是方便理解;它的劣势是性能比较低。 计算机可以简单的理...

16210
来自专栏大大的微笑

Java线程池

       概述:         线程池,从字面含义来看是管理同一组同构工作线程的资源池。线程池与工作队列是密切相关的, 工作队列保存了所有等待执行的...

2056
来自专栏JAVA高级架构

「浅入深出」MySQL 中事务的实现

关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的;在这篇...

3448

扫描关注云+社区