| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL锁机制 -> 正文阅读 |
|
[大数据]MySQL锁机制 |
锁机制介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 2)锁的分类 ? ? ? ?根据对数据操作的类型,可以分为读锁和写锁,读锁(共享锁)就是针对同一份数据,多个读操作可以同时进行而不会互相干扰;写锁(排它锁)是其他写操作没有完成之前,会阻断其他写锁和读锁。 ? ? ? ?根据加锁范围的粒度,可以分为全局锁、表锁和行锁。 3)读操作加写锁的场景 ? ? ? ?所有当前读操作加写锁,例如:select … for update、update、delete 全局锁 ? ? ? ?对整个数据库实例进行加锁。通过加全局读锁实现,命令是Flush tables with read lock(FTWRL)。 2)全局锁的阻塞 当加全局锁时,以下操作会被阻塞:DDL、DML和更新类事务等语句。 3)全局锁的数据备份应用 【典型应用】 ? ? ? ?典型应用是做全库数据的逻辑备份。 【FTWRL的局限性】 执行FTWRL后数据库处于只读状态,以确保其他线程不会对数据库做更新。如果是在主库上做备份,那么在备份期间都不能执行更新操作,业务基本上就要停摆;如果是在从库上备份,那么备份期间不能执行主库同步过来的binlog,会导致主从延时。 【官方备份工具】 ? ? ? ?MySQL官方备份数据工具是mysqldump,如果存储引擎支持可重复读隔离级别则采用single-transaction方法进行备份,否则采用Flush tables with read lock方法,而由于FTWRL的局限性,所以尽量不使用MyISAM引擎,而使用Innodb引擎。 ? ? ? ?Single-transaction方法是指在备份数据时会启动事务来确保拿到一致性视图,而由于MVCC的存在,在备份过程中是数据库是可以正常更新的。 4)全局锁和readonly参数在全局只读上的应用 ? ? ? ?相同点:Readonly设置为true时与全局锁都可以实现只读功能; ? ? ? ?不同点:1.ReadOnly的特点:Readonly还会用来做一些其他逻辑,例如判断主从库;2.全局锁的特点:全局锁不仅能实现只读操作,还能阻止DDL和DML操作;3.在异常处理机制上:当发生异常导致客户端断开连接再次重连时,全局锁会自动被自动释放,而readonly的状态不会发生改变。 表级锁 ? ? ? ?表级锁有两种,一种是表锁,还有一种是元数据锁 2)表级锁的读锁和写锁特点 ? ? ? ?读锁之间不互斥,多个线程可同时对一张表执行增删改查操作。 ? ? ? ?写锁之间、读锁和写锁之间是互斥的,用来保证表结构操作的安全性。 ???????表锁 ? ? ? ?偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率高,并发度低。更加注重于读数据的功能。 2)加锁和解锁操作 ? ? ? ?加锁:lock table 表名 read/write ? ? ? ?解锁:unlock table 表名 ? ? ? ?一般不需要显示的使用加锁和解锁语句实现表锁,在执行查询功能时会自动加读锁,在执行写入功能时一般会自动加写锁,执行完成后会主动释放,一般显示加锁通常是在模拟事务过程。 3)查看表是否加锁的方式 ? ? ? ?采用show open tables语句,从中找到要查看表的In_use属性,如果为0表示没有加锁,反之就是加锁了(读锁或写锁)。 4)表锁的特点 ? ? ? ?【读锁的特点】如果有多个对象对一张加读锁的表进行操作,可以进行读操作,但是不可以进行写操作,而且执行写操作会报错。 ? ? ? ?【写锁的特点】如果有多个对象对一张加写锁的表进行操作,加写锁的对象可以执行读操作和写操作,但是该对象在解锁之前不能再访问其他表;在加写锁期间,其他对象无法访问加写锁的表,当加写锁的表被解锁后,其他对象对写锁的表的操作会立即执行。 ? ? ? ?【总结】读锁时,加锁对象自己可读但不可写该表,可以读写其他表;其他对象对加锁表可读不可写。加写锁时,加锁对象自己可读可写,加锁对象不能读写其他表;其他对象不能读写。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:18:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |