MySQL数据库锁机制

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。 https://blog.csdn.net/robinson_0612/article/details/84562905

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。在MySQL数据库中支持多种不同粒度的锁来兼顾数据库并发与一致性问题。本文主要描述MySQL锁工作机制及其锁类型,粒度等。

一、MySQL数据库锁管理机制

SQL层实现的锁机制    Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作。一种特别的meta-data元数据类型,叫Name Lock。    表级table-level数据锁    全局读锁—FLUSH TABLES WITH READ LOCK

引擎层实现的锁机制    存储引擎特有机制—row locks行锁,page locks页锁,table locks表级,版本控制

二、锁执行流程

计算语句使用到的所有表 在每个表:打开open表—从table cache缓存里得到TABLE对象,并在此表加上meta-data元数据锁 等待全局读锁后改变数据 在每个表:锁lock表—在表加上table-level数据锁 执行语句:调用:handler::write_row()/read_rnd()/read_index()等;隐式地调用引擎级engine-level锁机制 在每个表:释放表的数据锁 在每个表:释放表的DDL锁并把表放回table?cache缓存里 DDL语句也是一样,没有典型的执行计划

三、锁粒度

共享锁(S):允许一个事务去读一行 排他锁(X):允许一个事务更新或删除一行 事务A锁住了表中的一行,让这一行只能读,不能写。之后,事务B申请整个表的写锁。如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的。数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁。数据库要怎么判断这个冲突呢? 普通认为两步:    step1:判断表是否已被其他事务用表锁锁表。    step2:判断表中的每一行是否已被行锁锁住。但是这样的方法效率很低,因为要遍历整个表。 所以解决方案是:意向锁。

InnoDB支持多粒度锁定,这种锁定允许在行级上的锁和表级上的锁同时存在。因此InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表级锁。用于解决表级锁和行级锁之间的冲突    意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。    意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

间隙锁 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。

因为Query执行过程中通过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。 间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定值范围内的任何数据,在某些场景下这可能会针对性造成很大的危害。

四、InnoDB行级锁

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

如何优雅地优化MySQL大表

除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是...

16130
来自专栏测试开发架构之路

MySQL/Oracle视图的创建与使用

视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。

13130
来自专栏idba

死锁案例之五

死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友...

11840
来自专栏Rgc

提高查询数据速度

在实际项目中,通过设计表架构时,设计系统结构时,查询数据时综合提高查询数据效率 1.适当冗余 数据库在设计时遵守三范式,同时业务数据(对数据的操作,比如资料...

38680
来自专栏杨建荣的学习笔记

简单分析oracle的数据存储(r2笔记89天)

在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以...

31880
来自专栏FreeBuf

企业安全建设之路:端口扫描(下)

0x00、前言 在企业安全建设过程当中,我们也不断在思考,做一个什么样的端口扫描才能企业业务需求。同时,伴随着企业私有云、混合云以及公有云业务部署环境的不断变...

558100
来自专栏PHP在线

MySQL 在并发场景下的问题及解决思路

对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为...

25040
来自专栏数据和云

MySQL 大表优化方案,收藏了细看!

当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化。 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分...

342100
来自专栏用户画像

mysql模拟题三

  9、找回mysql服务器root密码的很重要的一步是跳过权限表的检查启动mysql,该命令是(D)(2分)

13720
来自专栏Linyb极客之路

MySQL锁机制及优化

总的来说,MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。下面我们先分析一下MySQL这三种锁定的特点和各自的优劣所在。

21920

扫码关注云+社区

领取腾讯云代金券