| |
|
开发:
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的表锁 |
目录 共享锁与排它锁(读锁和写锁)读锁(共享锁):针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,互相不阻塞 写锁(排它锁):当前写操作没有完成前,他会阻断其他的写锁和读锁。这样就保证了在一定时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的统一资源 对于innoDB来说,读锁可以加在表上,也可以加在行上。 (行级读写锁)如果一个事务T1已经获得了某行R的读锁,那么此时另一个的事务T2是可以去获得这个行R的读锁的,因为读取的操作并没有改变行而的数据;但是,如果某个事务T3想获得行R的写锁,他必须等T1,T2释放R上的读才可以。 1、锁定读在采用加锁方式解决脏读、不可重复读、 幻读这些问题时,读取一条记录时需要获取该记录的S锁,其实是不严谨的,有时候需要在读取记录时就获取记录的X锁,来禁止别的事务读写该记录,为此MySQL提出 了两种比较特殊的SELECT语句格式: 对读取的记录加读锁 mysql在普通的SELECT语句后边加LOCK IN SHARE MODE ,如果当前事务执行了该语句,那么就会为读到的记录加读锁,这样允许别的事务继续获取这些记录的读锁(比方说别的事务也使用SELECT ... LOCK IN SHARE MODE语句来读取这些记录),但是不能获取这些记录的X锁(比如使用 SELECT ... FOR UPDATE 语句来读取这些记录,或者直接修改这些记录)。如果别的事务想要获取这些记录的X锁,那么它们会阻塞,直到当前事务提交之后将这些记录上的S锁释放掉。 对读取记录加写锁 ?在普通的SELECT语句后边加FOR UPDATE ,如果当前事务执行了该语句,那么它会为读取到的记录加写锁,这样既不允许别的事务获取这些记录的写锁(比方说别的事务使用SELECT LOCK IN SHARE MODE 语句来读取这些记录),也不允许获取这些记录的X锁(比如使用SELECT? ?FOR UPDATE 语句来读取这些记录,或者直接修改这些记录)。如果别的事务想要获取这些记录的S锁或者写锁,那么它们会阻塞,直到当前事务提交之后将这些记录上的写锁释放掉。 MySQL8.0新特性:
2、写操作????????平常所用到的写操作无非是DELETE、UPDATE 、INSERT 这三种:
●INSERT : 操作力度划分:表级锁、页级锁、行锁 为了尽可能提高数据库的并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但是管理锁是很耗资源的事情(涉及获取、检查、释放锁等动作)。因此数据库系统需要在高并发响应和系统性能两方面进行平衡,这样就产生了“锁粒度(Lock granularity) ”的概念。 1、表锁不依赖于储存引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),开销小(因为力度大)。表锁不会产生死锁问题。但是表锁会影响并发率 表级别的读锁和写锁在对某个表执行SELECT、INSERT、 DELETE、 UPDATE语句时,InnoDB存储引擎是不会为这个表添加表级别的读锁或者写锁的。在对某个表执行一些诸如ALTER TABLE、DROP TABLE 这类的DDL语句时,其他事务对这个表并发执行诸如SELECT、INSERT、 DELETE、 UPDATE的语句会发生阻塞。同理,某个事务中对某个表执行SELECT、INSERT、DELETE、 UPDATE语句时,在其他会话中对这个表执行DDL语句也会发生阻塞。这个过程其实是通过在server层使用一种称之为元数据锁(英文名: Metadata Locks ,简称MDL )结构来实现的。 一般情况下, 不会使用InnoDB存储引擎提供的表级别的读锁和写锁。只会在一些特殊情况下,比方说崩溃恢复过程中用到。比如,在系统变量autocommit=0,innodb_ table_ locks = 1 时,手动获取InnoDB存储弓|擎提供的表t的S锁或者X锁可以这么写: 总结: ?意向锁(IS、Ik)innoDB支持多粒度锁,他允许行级锁和表锁共存 1、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。 ?即:意向锁是由储存引擎自己维护的,用户无法手动操作意向锁,在为数据加共享/排它锁之前,InnDB会先获取数据行所在数据表的对应意向锁。 假如说我对这个表的数据上表锁,我首先要确定我有没有对其中一行上行级锁,这时候如果没有行级锁你就需要一条一条的判断了,而当你有行级锁时,会自动加意向锁,这时候加表锁的时候,就可以直接判断了。 从上面的案例可以得到如下结论: 自增锁(TUTO-INC锁)了解即可 主要是针对有自增主键的表,当要插入新的主键时,会对这个表上锁,当一个事务持有锁时,其他的事务阻塞。 三种锁定模式传统模式,连续锁定模式,交错锁定模式 元数据锁(MDL锁)?MySQL5.5引入了meta data lock,简称MDL锁,属于表锁范畴。MDL的作用是,保证读写的正确性。比如,如果一个查询正在遍历一个表中的数据, 而执行期间另-个线程对这个表结构做变更,增加了一列, 那么查询线程拿到的结果跟表结构对不上,肯定是不行的。因此,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。读写锁之间、写锁之间是互斥的,用来保证变 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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:13:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |