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 条评论
登录 后参与评论

相关文章

来自专栏数据和云

Real-time materialized view,面向开发者的12.2新特性

题记:在12.2之前,如果使用on command刷新物化视图,必须得有个job来定时的刷,那么,在一次job运行之后,下一次job到来之前,如果基表有数据变化...

2994
来自专栏性能与架构

格式化SQL来提高效率

对SQL语句进行格式化不会让其运行得更快,但对我们的工作效率是有很大好处的 (1)提高SQL的可读性大大提高,便于维护 (2)提高开发效率,方便测试 例如 ? ...

3409
来自专栏MySQL实战分享

【MySQL经典案例分析】 Waiting for table metadata lock

2018年某个周末,接到连续数据库的告警,看到too many connection的报错信息,基本上可以把问题定位在...

4606
来自专栏不想当开发的产品不是好测试

mysql 删表引出的问题

背景 将测试环境的表同步到另外一个数据库服务器中,但有些表里面数据巨大,(其实不同步该表的数据就行,当时没想太多),几千万的数据!! 步骤 1. 既然已经把数据...

2447
来自专栏数据和云

腾讯游戏DBA利刃 - SQL审核工具介绍

作者介绍 ? 韩全安(willhan) 华中科技大学,硕士,现代数据库方向。2013年毕业,就职于腾讯到今,工作项目:TMySQL、SQL审核、InnoDB列压...

9806
来自专栏PingCAP的专栏

TiDB Best Practice

本文档用于总结在使用 TiDB 时候的一些最佳实践,主要涉及 SQL 使用、OLAP/OLTP 优化技巧,特别是一些 TiDB 专有的优化开关。建议先阅读讲解 ...

1K0

使用 Excel 分析 CloudStack 使用记录

注:本文最初由 David Nailey 在 Build a Cloud 博客上撰写。

2049
来自专栏思考的代码世界

Python网络数据采集之存储数据|第04天

存储媒体文件有两种主要的方式:只获取文件 URL 链接,或者直接把源文件下载下来。

4387
来自专栏沃趣科技

Oracle Real Time SQL Monitoring

术语说明 TableQueue,消息缓冲区,在并行操作中使用,用于PX进程之间的通信,或者PX进程与QC进程之间的通信,是内存中的一些page,每个消息缓冲区的...

4388
来自专栏数据和云

Library Cache优化与SQL游标

? 冷菠 冷菠,网名悠然(个人主页http://www.orasky.net),资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队...

2835

扫码关注云+社区