行锁案例讲解|学习笔记

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

开发者学堂课程【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

相关文章
|
6月前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
66 4
|
6月前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
6月前
|
关系型数据库 MySQL 数据库
|
6月前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
164 1
|
数据库
深入浅出理解数据库s锁和x锁
深入浅出理解数据库s锁和x锁
661 1
|
存储 关系型数据库 MySQL
深入探究MySQL临键锁
临键锁(Next-Key Lock):临键锁是查询时InnoDB根据查询的条件而锁定的一个范围,这个范围中包含有间隙锁和记录数;临键锁=间隙锁+记录锁。 其设计的目的是为了解决Phantom Problem(幻读);主要是阻塞insert,但由于临键锁中包含有记录锁,因此临键锁所锁定的范围内如果包含有记录,那么也会给这些记录添加记录锁,从而造成阻塞除insert之外的操作;
2260 1
|
6月前
|
关系型数据库 MySQL 数据库
MySQL锁三部曲:临键、间隙与记录的奇妙旅程
MySQL锁三部曲:临键、间隙与记录的奇妙旅程
504 0
|
关系型数据库 MySQL 测试技术
探索MySQL间隙锁的奥秘
MySQL中的间隙锁(Gap Lock)是一种锁机制,用于在多个事务中保护数据的一致性。它主要用于防止并发事务插入新数据或者修改已有数据时,导致其他事务读取到不一致的结果。
探索MySQL间隙锁的奥秘
|
存储 关系型数据库 MySQL
深入浅出InnoDB中的行锁
深入浅出InnoDB中的行锁
深入浅出InnoDB中的行锁
|
存储 SQL 关系型数据库
读锁案例讲解|学习笔记
快速学习读锁案例讲解
读锁案例讲解|学习笔记