my40_MySQL锁概述之意向锁

 本文在锁概述的基础上,通常实验举例,详细地介绍了意向锁的原理。

锁范围 

全局锁(global lock)
表锁(table lock)
行锁 (row lock)

ROW LOCK的粒度
LOCK_REC_NOG_GAP, record lock with out gap lock
LOCK_GAP, gap lock
LOCK_ORDINARY , next key lock = record lock + gap lock

锁等待与死锁
锁等待 事务提交或等待超时;死锁,是一个死循环。死锁中必有锁等待。

表锁
5.5以后在server层实现表锁
innodb中有IS/IX表级锁,以及自增锁(auto-inc)

读锁
加读锁后,只能对表读,不能对表写;允许多个会话同时读;其他会话可以加共享读锁
lock table table_name read

写锁
lock table table_name write
持有锁的会话可写可读
其他会话访问表或请求加锁都会被阻塞,直到锁释放

释放锁
unlock tables;
lock table 锁不能相互嵌套,一个事务开始就意味着另外一个事务结束
显式开启一个事务,因为事务中不能支持表锁,所以事务开始则表锁断开
Kill或连接断开

innodb锁
默认为行锁
在索引上加锁来实现行锁
如果没有索引,那么升级为全表记录锁,最终效果等同于表锁;但表锁只需要在根节点上加锁,而不是对所有记录加锁,所以代价要小一些

 

锁类型
共享锁
排他锁/独占锁
意向锁,innodb特有,加在表级别上的锁


共享锁与独占锁均用于事务当中,随事务的结束而解除。

共享锁(share lock)
又称读锁,读取操作创建的锁。
一旦上锁,任何事务(包括当前事务)无法对其修改,其他事务可以并发读取数据,也可在对此数据再加共享锁
语法:SELECT ... LOCK IN SHARE MODE;


排他锁(exclusive lock)
又称写锁,如果事务对数据A加上排他锁后,则其他事务不可并发读取数据,也不能再对A加任何类型的锁。获得排他锁的事务既能读数据,又能修改数据。
语法:SELECT ... FOR UPDATE
这里的“其他事务不可并发读取数据”,指的是不可以加共享锁,即不可以以lock in share mode的方式读取数据,比如

会话一

mysql> select * from test for update;
+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  1 |    1 |    0 |
|  2 |    3 |    1 |
|  3 |    4 |    2 |
|  5 |    5 |    3 |
|  7 |    7 |    4 |
| 10 |    9 |    5 |
+----+------+------+
6 rows in set (0.00 sec)

会话二:

mysql> select * from test lock in share mode;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

直接查询完全可以

mysql> select * from test;
+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  1 |    1 |    0 |
|  2 |    3 |    1 |
|  3 |    4 |    2 |
|  5 |    5 |    3 |
|  7 |    7 |    4 |
| 10 |    9 |    5 |
+----+------+------+
6 rows in set (0.00 sec)

这是因为直接查询走的是一致性快照读,读的是MVCC版本控制下的快照,不加锁;换句话说,排他锁排斥的“读”,是指S锁下的读,或者说是当前读

意向锁
InnoDB的表级锁,其设计目的主要是为了在一个事务中揭示下一步将要被请求的锁的类型。
InnoDB中的两个表锁:
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁
意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
意向锁是InnoDB自动加的,不需要用户干预。

意向锁是表级锁
事务要获取表A某些行的S锁必须要获取表A的IS锁
事务要获取表A某些行的X锁必须要获取表A的IX锁


会话一锁定了全表

 会话二,结果集为空时不加锁

 

意向锁的目的在于提高innodb性能,会话一锁定的是全表,那么会话二一看全表已被锁定,则不再去看每行是否锁定
会话二先判断表上有没有表锁,如果没有表级锁,则开始判断有没有行级锁

会话一:不锁定全表的S锁

 会话二:立即执行,不被锁;v1上有索引

 

v1字段上有索引,v2字段上没有索引;有索引时,优先按有索引的规则来,当字段上没有索引时,S锁,X锁走意向锁的逻辑;
会话一

mysql> begin;select * from test where v1 >4 lock in share mode;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  5 |    5 |    3 |
|  7 |    7 |    4 |
| 10 |    9 |    5 |
+----+------+------+
3 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> begin;select * from test where v2 >4 lock in share mode;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
| 10 |    9 |    5 |
+----+------+------+
1 row in set (0.00 sec)

会话二:

mysql> begin;select * from test where v1 < 2 for update;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  1 |    1 |    0 |
+----+------+------+
1 row in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> 
mysql> 
mysql> begin;select * from test where v2 < 2 for update;
Query OK, 0 rows affected (0.00 sec)ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> 

如果不是S锁,而是快照读的话,不会走意向锁的逻辑,因为快照读不加锁(不管是RC还是RR隔离级别);

会话一

mysql> begin;select * from test where v2 >4;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
| 10 |    9 |    5 |
+----+------+------+
1 row in set (0.00 sec)

会话二:立即执行,没有锁等待

mysql> begin;select * from test where v2 < 2 for update;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  1 |    1 |    0 |
|  2 |    3 |    1 |
+----+------+------+
2 rows in set (0.00 sec)

 

对于无索引的情况,更新任何一条记录,都会对该表加锁,这时意向锁将非常有用;但这个场景有个例外-->“半一致性读”

半一致性读的条件:
5.7及以下版本时,需要innodb_locks_unsafe_for_binlog 开启或事务隔离级别为RC,语言类型为update
8.0版本,语言类型为update,事务隔离级别为RC;innodb_locks_unsafe_for_binlog 参数被废弃。

8.0中半一致性读测试
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

会话一

mysql> begin;select * from test where v2 >4 for update;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
| 10 |    9 |    5 |
+----+------+------+
1 row in set (8.77 sec)

会话二:显式开始一个事务被阻塞,直接使用update语句不被阻塞;注意v2字段上无索引

mysql> begin;select * from test where v2 < 2 for update;
Query OK, 0 rows affected (0.00 sec)^C^C -- query aborted
ERROR 1317 (70100): Query execution was interruptedmysql> select * from test;
+----+------+------+
| id | v1   | v2   |
+----+------+------+
|  1 |    1 |    0 |
|  2 |    3 |    1 |
|  3 |    4 |    2 |
|  5 |    5 |    3 |
|  7 |    7 |    4 |
| 10 |    9 |    5 |
+----+------+------+
6 rows in set (0.00 sec)mysql> update test set v2 = 1 where v2 < 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 2  Changed: 1  Warnings: 0mysql> exit

8.0的RR隔离级别
mysql> set global transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
会话一:X锁测试

mysql> begin;select * from test where v2 >4 for update;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
| 10 |    9 |    5 |
+----+------+------+
1 row in set (0.00 sec)

 

会话二:

mysql>  update test set v2 = 1 where v2 < 2;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

8.0中半一致读的条件:RC及以下隔离级别,update语句

对于RR隔离级别,无索引的情况下,S锁,X锁,走意向锁的逻辑

会话一:S锁测试

mysql> begin;select * from test where v2 >4 lock in share mode;
Query OK, 0 rows affected (0.00 sec)+----+------+------+
| id | v1   | v2   |
+----+------+------+
| 10 |    9 |    5 |
+----+------+------+
1 row in set (0.00 sec)

会话二:

mysql>  update test set v2 = 1 where v2 < 2;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

所以意向锁的关键在于是否是S锁与X锁;如果是RC隔离级别,需要注意一下“半一致性读”
S锁会先有全表上加IS,X锁会先在全表上加IX;IS与IX互斥,IX与IX及IS互斥;

对于经常使用的RR隔离级别,对于无索引字段,意向锁减少了后来锁判断行记录上是否有锁的时间

 

转载于:https://www.cnblogs.com/perfei/p/11367804.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言的整型溢出问题

整型溢出有点老生常谈了&#xff0c;bla, bla, bla… 但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出&#xff0c;缓冲区溢出会导致各种黑客攻击&#xff0c;比如最近OpenSSL的heartbleed事件&#xff0c;就是一个buffer overread的事件。在这里写下这篇文章&…

Thymeleaf 简介、教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可…

如期而至,GCC 4.9.0正式版发布!

摘要&#xff1a;GCC是一套由GNU开发的编程语言编译器。近日&#xff0c;GCC 4.9.0发布&#xff0c;主要新特性包括&#xff1a;提升了C11和C14特性&#xff1b;诊断信息支持彩色显示&#xff1b;移除mudflap运行时检查器等。 如期而至&#xff0c;GCC 4.9.0发布&#xff0c;该…

《 追风筝的人 》:“ 为你,千千万万遍 ” ...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 刚来研发中心的时候&#xff0c;在我的新位置上发现了一本书&#xff0c;问后得知是前同事留下的&#xff0c;已无主 。 我就收下了。一…

广州科目三考试 不得不看的十条提醒(图)

导读&#xff1a; 考试科目三时考试常会有点小紧张。经常会有考生因为紧张犯了些小错误而被pass掉。如何来应对呢&#xff1f;首先是放松心态&#xff0c;这点其实大家都明白&#xff0c;只是做不到。有人一到考试的时候就紧张&#xff0c;完全思维混乱&#xff0c;动作僵硬。建…

HDU 6706 huntian oy

题意 求以下式子的值&#xff0c;T组数据各个字母满足1 ≤ n , a , b ≤109 &#xff0c;a,b互质 思路&#xff1a; 卡常毒瘤题&#xff0c;出题人时限卡的非常紧&#xff0c;考场上推出来又T又WA 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;…

linux 查看空间(内存、磁盘、文件目录、分区)的几个命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. free free命令用于显示内存状态。 free指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#x…

广州学车科目三路考操作步骤要领

广州学车&#xff0c;科目三路考操作步骤是关键&#xff0c;许多朋友明明会开车&#xff0c;却因为一些步骤上的小疏忽而不得到不补考&#xff0c;今天总结出这个广州学车科目三路考操作步骤要领&#xff0c;希望对大家有帮助&#xff1a; 广州学车&#xff0c;科目三路考操作步…

如何和何时使用 CSS 的权重设置 !important (建议:永不使用!)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 特别声明&#xff1a;此篇文章由David根据Louis Lazaris的英文文章原名《!important CSS Declarations: How and When to Use Them》进行…

广州科目三电子考需注意哪些问题?

广州驾考科目三从4月1日起开始试行电子评判与人工评判相结合的新制度&#xff0c;即电子路考&#xff0c;多数学员对新制度表示不适应&#xff0c;那么&#xff0c;科目三电子路考需要注意哪些问题? 从4月1日开始&#xff0c;科目三考试将试行计算机辅助与人工评判相结合的制度…

解决 VUE: 本地运行和服务器上运行样式不一致,run、build 运行时样式有出入

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我的情况&#xff1a; 我遇到 2 种情况&#xff0c;一个是表格的分页样式有变化。另一个是导航菜单样式有变化。 2. 解决&#xff…

开发中的“软”与“硬”:高画质移动游戏开发之道

摘要&#xff1a;游戏的效果不仅与游戏引擎的渲染相关&#xff0c;与硬件优化也有千丝万缕的联系。一款基于芯片优化的移动游戏界面&#xff0c;甚至可以堪比视频游戏的视觉效果。高通半导体事业部资深经理刘晓光从软硬件两个层面分享了移动游戏开发之道。 在今年的Unity亚洲开…

解决 VUE: [Vue warn]: Do not use built-in or reserved HTML elements as component id: xx

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 新增一个组件&#xff0c;运行无问题&#xff0c;但F12报错&#xff1a; vue.esm.js?efeb:591 [Vue warn]: Do not use built-in o…

Linux系统重置和修改root密码

Linux系统经常会出现忘记root密码的情况&#xff0c;写下此随笔&#xff0c;以便记忆和学习。 一、重置root密码的步骤如下&#xff1a; 1.如果系统是开机状态&#xff0c;重启一下。进到下面这个界面按字母“e”键。 2.找到 linux16这一行&#xff0c;将下图红框中的内容修改为…

KETTLE 使用教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表…

为什么你应该参与到开源项目中

试图描述开源并不是一件容易的事——很多图书作家&#xff0c;社区领袖和主持人对于开源社区的工作原理以及它是否对新人程序员有帮助持不同意见试图描述开源并不是一件容易的事——很多图书作家&#xff0c;社区领袖和主持人对于开源社区的工作原理以及它是否对新人程序员有帮…

历史上最知名的15位计算机科学家

基于维基百科上超过11,000位历史人物的数据&#xff0c;麻省理工学院媒体实验室创建出了一种名为“历史人气指数&#xff08;HPI&#xff09;”的参数。以下列出了15个历史上最知名的计算机科学家&#xff0c;我们来看一下他们的“HPI”分数。麻省理工学院媒体实验室推出了一个…

想要转人工智能,程序员该如何学习?(学习路线、知识体系)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 对于程序员来说&#xff0c;码农之路并不是一帆风顺。对于每一个入行IT业的社会青年来说&#xff0c;谁不是抱着想要成为最高峰的技术大…

【转载】矩阵求导、几种重要的矩阵及常用的矩阵求导公式

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/daaikuaichuan/article/details/80620518 一、矩阵求导 一般来讲&#xff0c;我们约定x(x1,x2,...xN)…

数据结构与算法绪论

基本概念和术语 数据数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 数据元素数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成…