/images/logo.jpg

[MySQL] 2. 锁机制执行分析

[MySQL] 2. 锁机制执行分析

引言

  • 在高并发环境下,数据库锁机制是确保数据一致性和完整性的关键手段。MySQL作为广泛使用的关系型数据库,提供了多种锁类型和机制来管理并发访问。然而,锁的使用不当可能导致性能瓶颈、死锁等问题,影响系统的稳定性和响应速度。

锁相关基本概念

  • 锁的定义:锁是一种机制,用于控制对共享资源的访问,防止多个事务同时修改同一数据,确保数据的一致性和完整性。
  • 锁的类型
    • 表级锁:锁定整个表。
    • 共享锁(S锁):允许多个事务同时读取数据,但不允许修改。
    • 排他锁(X锁):允许一个事务修改数据,其他事务既不能读取也不能修改。
    • 意向锁(IS锁和IX锁):用于表级别,表示事务打算在行级别上加锁。
    • 自增锁(AUTO-INC锁):用于处理自增列的并发插入,防止冲突。
    • 间隙锁(Gap Lock):锁定索引记录之间的间隙,防止幻读。
    • 临键锁(Next-Key Lock):结合了记录锁和间隙锁,锁定索引记录及其前面的间隙。
    • 记录锁(Record Lock):锁定具体的索引记录。
    • 行级锁:锁定具体的行。
    • 乐观锁:通过版本号或时间戳实现,适用于读多写少的场景。
    • 悲观锁:通过显式加锁实现,适用于写多读少的场景。
  • 死锁:多个事务互相等待对方释放锁,导致无法继续执行。
  • 锁的兼容性:不同类型的锁之间存在兼容性规则,决定了哪些锁可以同时存在。
  • 锁的粒度:锁定资源的范围,粒度越细,系统并发性越高,但管理开销也越大。

MySQL锁介绍

基本命令

  • 创建测试表
1
2
3
4
5
6
7
8
9
-- auto-generated definition
create table example_single_pk
(
    id      bigint                              not null comment 'id'
        primary key,
    created timestamp default CURRENT_TIMESTAMP not null comment 'create time',
    updated timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'update time'
)
    comment 'example_single_pk' charset = utf8mb4;
  • 执行命令
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SELECT id, created, updated FROM example_single_pk;

INSERT INTO example_single_pk (id) VALUES (1);

SELECT id, created, updated FROM example_single_pk;

UPDATE example_single_pk SET id = 6 WHERE id = 1;

SELECT id, created, updated FROM example_single_pk;

DELETE FROM example_single_pk WHERE id = 1 or id = 6;

SELECT id, created, updated FROM example_single_pk;
  • 结果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mysql> SELECT id, created, updated FROM example_single_pk;
Empty set (0.00 sec)

mysql> 
mysql> INSERT INTO example_single_pk (id) VALUES (1);
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> SELECT id, created, updated FROM example_single_pk;
+----+---------------------+---------------------+
| id | created             | updated             |
+----+---------------------+---------------------+
|  1 | 2025-09-27 11:14:40 | 2025-09-27 11:14:40 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> 
mysql> UPDATE example_single_pk SET id = 6 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> 
mysql> SELECT id, created, updated FROM example_single_pk;
+----+---------------------+---------------------+
| id | created             | updated             |
+----+---------------------+---------------------+
|  6 | 2025-09-27 11:14:40 | 2025-09-27 11:14:40 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> 
mysql> DELETE FROM example_single_pk WHERE id = 1 or id = 6;
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> SELECT id, created, updated FROM example_single_pk;
Empty set (0.00 sec)

按粒度分

表级锁 - READ

加锁
1
2
mysql> LOCK TABLES example_single_pk READ;
Query OK, 0 rows affected (0.00 sec)

/images/12.%20mysql%20lock/1.1%20lock%20tables%20read.png

[Github] 3. Basic-Check:参数验证框架

[Github] 3. Basic-Check:参数验证框架

引言

在日常的Java开发中,方法参数验证是一个常见且重要的需求。传统的参数验证通常需要在每个方法中编写大量的if-else判断代码,不仅冗余繁琐,还容易遗漏。Basic-Check-Java正是为了解决这一痛点而诞生的轻量级参数验证框架。

[Cluster] 1. 浅谈RAFT算法:从单节点到分布式共识的完整演进

[Cluster] 1. 浅谈RAFT算法:从单节点到分布式共识的完整演进

引言

  • RAFT(Raft Consensus Algorithm)是一种分布式共识算法,旨在解决分布式系统中多个节点对数据状态达成一致的问题。
  • 相比于著名的Paxos算法,RAFT的设计理念是"可理解性"(understandability),通过清晰的角色划分和简洁的状态转换,让开发者更容易理解和实现。
  • 本文将通过11个详细的图例,展示RAFT算法从单节点到多节点集群的完整演进过程,包括正常运行、故障处理、网络分区和冲突解决等关键场景。

RAFT核心概念

  • 在深入分析之前,让我们先了解RAFT的几个核心概念:

节点状态(Node States)