行锁案例讲解|学习笔记

简介: 快速学习行锁案例讲解

开发者学堂课程【MySQL 高级应用 - 索引和锁:行锁案例讲解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8634


行锁案例讲解


目录:

一、建表 SQL

二、行锁定基本演示

 

一、建表 SQL

create table test_innodb_lock (a int(11),b varchar(16))engine =innodb;
insert into test_innodb_lock values(1,'b2);

insert into test_innodb_lock values(3,'3&apos');
insert into test_innodb_lock values(4,'4000&apos');

insert into test_innodb_lock values(5,'5000&apos');

insert into test_innodb_lock values(6,'6000&apos');

insert into test_innodb_lock values(7,7000&apos');

insert into test_innodb_lock values(8,'8000&apos');

insert into test_nnodb_lock values(9,'9000&apos');

insert into test_ innodb_lock values(1,b1&apos');
create index test_innodb_a_ind on test_innodb_ lock(a);
create index test_innodb_lock_b_ind on test_innodb_lock(b);

此时单独为此表的a字段单独建立了“test_innodb_a_ind”索引,单独此表 b 字段建立了“test_innodb_lock_b_ind”引擎,此为单值索引。此时建表完成。

 

二、行锁定基本演示

1.大纲

image.png

2.实操

1)首先更新表 ssesion-1,进行一行的行锁

+------+------+

|  a   | b    |

+------+------+

|   1  | b2   |

|   3  | 3     |

|   4  | 4000  |

|   5  | 5000  |

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |

|   1  | 5000  |

9 rows in set (0.00 sec )
mysq1>

2

mysq1>update test_innodb_ lock set b=' 4001' where a=4

QueryOK1 row affected(0.00 sec )

//回车得到

Rows matched :1 Changed :1 Warnings :0

mysq1>

在查询时,观察一下第4条记录是否为4001

故,首先应查看自己所写的数据

3)将 session-1b 字段更改为4002

session-2mysq1> update test_innodb_lock set b= '4003' where a=4;

此时 session-1commitsession-2即将 update,但 session-2出现阻塞,则只能在两方进行 commit 操作,即两方多次保证了 commit 的执行。

ssesion-1

+------+--------+

|  a   | b     |

+------+--------+

|   1  | b2    |

|   3  | 3     |

|   4  | 4002   |

|   5  | 5000  |

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |

|   1  | 5000  |

+------+--------+

9 rows in set (0.00 sec )

mysq1>commit

Query oK, 0 rows affected (0.00 sec )

mysq1> commi;t

ERROR1 064( 42000): You have an error in your SQL syntax; checkthe manua1 that corresponds to your MySQL server

versionorthe right syntax to use nearcommi' at 1ine l> ;

ERROR 1064 (42000): You have an error in your SQL syntax; checkthe manua1 that corresponds to your MySQL serverversionorthe right syntaxm to use near 't' at 1ine 1

mysq1> commit ;

Query OK, 0 rows affected (0.00 sec )

mysq1>

+------+--------+

|  a   |  b     |

+------+--------+

|   1  |  b2    |

|   3  | 3     |

|   4  | 4003   |

|   5  | 5000  |

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |

|   1  | b1     |

+------+--------+

9 rows in set (0.00 sec )

ssesion-2

mysq1>select* feom test_innodb_lock;

+------+--------+

|  a   | b     |

+------+--------+

|   1  |  b2    |

|   3  | 3     |

|   4  |4003  |

|   5  | 5000  |

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |

|   1  | b1     |

+------+--------+

9 rows in set (0.00 sec )

mysq1>

提交更新解除阻塞,之后的更新则正常进行

session-2

mysq1>select* feom test_innodb_lock;

//进行 select

+------+--------+

|  a   | b     |

+------+--------+

|   1  | b2    |

|   3  | 3     |

|   4  | 4003  |

|   5  | 5000  |     //存在5号记录

|   6  | 6000  |

|   7  | 7000  |

|   8  | 8000  |

|   9  | 9000  |     //存在9号记录

|   1  | b1    |

+------+--------+

9 rows in set (0.00 sec )

由于添加的为行锁,如若 session-1首先改变4号记录,session-2 再次改变4号记录将会造成堵塞。

如若 session-2改变9号记录,则两者互不相干。

mysq1> update test_innodb_lock set b= '9001' where a=9;

Query OK, 1 row affected (0.00 sec )

Rowsmatched:1   Changed:1  Warnings :0

session-1

mysq1> update test_innodb_lock set b= '4005' where a=4;

//更新为4005

mysq1> update test_innodb_lock set b= '4005' where a=4;

Query OK, 1 row affected (0.00 sec )

Rowsmatched:1  Changed:1   Warnings :0

相关文章
|
10月前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
173 31
|
10月前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
数据库
深入浅出理解数据库s锁和x锁
深入浅出理解数据库s锁和x锁
993 1
|
存储 关系型数据库 MySQL
深入探究MySQL临键锁
临键锁(Next-Key Lock):临键锁是查询时InnoDB根据查询的条件而锁定的一个范围,这个范围中包含有间隙锁和记录数;临键锁=间隙锁+记录锁。 其设计的目的是为了解决Phantom Problem(幻读);主要是阻塞insert,但由于临键锁中包含有记录锁,因此临键锁所锁定的范围内如果包含有记录,那么也会给这些记录添加记录锁,从而造成阻塞除insert之外的操作;
2452 1
|
10月前
|
关系型数据库 MySQL 数据库
|
10月前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
277 1
|
10月前
|
关系型数据库 MySQL 数据库
MySQL锁三部曲:临键、间隙与记录的奇妙旅程
MySQL锁三部曲:临键、间隙与记录的奇妙旅程
693 0
|
SQL Java 数据库连接
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
137 0
|
SQL 关系型数据库 MySQL
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
!! 背景:最近在各种群和博客里,又看见了什么[乐观锁]、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行整理一下,揭开它神秘的面纱,给大家提供一个基本参考。作为开发人员不管是用什么编程语言,我觉得这些是应该要掌握的。知其然,知其所以然。 锁机制是 MySQL 中用来保证并发访问数据库时数据一致性和完整性的重要机制。在并发访问中,多个事务可能同时对同一份数据进行操作。如果不采用锁机制,就会出现数据错乱和丢失的问题。MySQL 中的锁机制主要包括以下几种类型:
397 0
MySQL沉浸式面试:隔离级别、锁、索引原理连环炮你扛得住吗?
基础篇主要是侧重基础知识,原理篇是有一定基础后的递进,通过学习本篇,不仅可以进一步了解MySQL的各项特性,还能为接下来的容灾调优打下坚实的基础。 现在,就让我们继续跟随阿柴进行这场沉浸式面试吧。