相关文章推荐
狂野的伤疤  ·  sql查询日期时间范围的数量-掘金·  2 年前    · 
自信的酱肘子  ·  如何通过切片器同步筛选两个数据透视表?_变化·  2 年前    · 
有爱心的香槟  ·  soap的client端JAVA例子_soa ...·  2 年前    · 
Code  ›  [精选]详细介绍MySQL中常见的锁开发者社区
mysql mysql数据库
https://cloud.tencent.com/developer/article/2051434
憨厚的大熊猫
1 年前
作者头像
全栈程序员站长
0 篇文章

[精选]详细介绍MySQL中常见的锁

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 全栈程序员必看 > [精选]详细介绍MySQL中常见的锁

[精选]详细介绍MySQL中常见的锁

作者头像
全栈程序员站长
发布 于 2022-07-19 10:48:23
238 0
发布 于 2022-07-19 10:48:23
举报

大家好,又见面了,我是全栈君。

一、死锁示例

考虑下面一个 MySQL 死锁的示例:

有如下一张表:

CREATE TABLE `test` (
`id` int(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中有如下数据:

mysql> SELECT * FROM test;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  5 | 5    |
| 10 | 10   |
| 15 | 15   |
| 20 | 20   |
| 25 | 25   |
+----+------+
6 rows in set (0.00 sec)

当 数据库 的隔离级别为Repeatable Read或Serializable时,我们来看这样的两个并发事务(场景一):

[精选]详细介绍MySQL中常见的锁

上面两个并发事务一定会发生死锁(这里之所以限定 RR和Serializable 两个隔离级别,是因为只有这两个级别下才会有 间隙锁/临键锁 ,而这是导致死锁的根本原因,后面会详细分析)。

我们再来看另外一个并发场景(场景二):

[精选]详细介绍MySQL中常见的锁

在这个并发场景下,两个事务均能成功提交,而不会有死锁。

在上面的示例中, 我们发现,select … for update虽然可以用于解决数据库的并发操作,但在实际项目中却不建议使用,原因是当查询条件对应的记录不存在时,很容易造成死锁。而造成死锁的原因和MySQL的锁机制有关。 本文将详细介绍常见的七种锁机制,了解了这些锁机制之后就能理解造成场景一死锁的根本原因以及场景一和场景二差异的原因。

二、MySQL的七种锁

  1. 行锁(Record Locks)
  2. 间隙锁(Gap Locks)
  3. 临键锁(Next-key Locks)
  4. 共享锁/排他锁(Shared and Exclusive Locks)
 
推荐文章
狂野的伤疤  ·  sql查询日期时间范围的数量-掘金
2 年前
自信的酱肘子  ·  如何通过切片器同步筛选两个数据透视表?_变化
2 年前
有爱心的香槟  ·  soap的client端JAVA例子_soapclient list_414rwbg435bw5_3sdf的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号