MySQL悲观锁是什么?底层实现原理?

数据库 MySQL
在 MySQL 中悲观锁(Pessimistic Lock),是一种并发控制机制,用于防止多个事务同时修改同一条数据,从而确保数据一致性。基于“悲观”的假设,认为在多用户环境下,数据被多个事务同时访问、或修改的冲突概率较高。

MySQL悲观锁经常在大厂被问到,比如MySQL悲观锁是什么?MySQL悲观锁有哪些?底层原理...等等,下面我来详解MySQL悲观锁。

MySQL悲观锁

图片图片

在 MySQL 中悲观锁(Pessimistic Lock),是一种并发控制机制,用于防止多个事务同时修改同一条数据,从而确保数据一致性。

基于“悲观”的假设,认为在多用户环境下,数据被多个事务同时访问、或修改的冲突概率较高。

因此,在操作数据之前,先对数据加锁,确保同一时刻只有一个事务能修改某条数据,避免脏读、幻读、丢失更新...等问题。

适用于 库存扣减、订单处理 ...等业务,防止库存超卖、或数据篡改。

悲观锁的实现

1.行级锁

MySQL悲观锁,依赖于数据库提供的锁机制来实现,比如:MySQL的InnoDB存储引擎提供了行级锁,用于实现悲观并发控制。

常见的行级锁包括 :SELECT ... FOR UPDATE,如下所示:

START TRANSACTION; -- 开启事务


-- 查询用户余额,并加锁,防止其他事务修改
SELECT balance FROM accounts WHERE user_id = 1 FOR UPDATE;


-- 更新用户余额
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;


COMMIT; -- 提交事务,释放锁
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

使用 SELECT ... FOR UPDATE 语句,对查询的行,加排他锁。

首先,事务 A ,先执行 SELECT ... FOR UPDATE,获取写锁;

然后,事务 B 试图执行 SELECT ... FOR UPDATE,会被阻塞,直到 事务 A 提交或回滚。

2.共享锁

使用 SELECT ... LOCK IN SHARE MODE 语句对查询的行加共享锁,如下所示:

START TRANSACTION;


-- 查询某个产品的库存,并加共享锁,防止其他事务修改
SELECT stock FROM products WHERE product_id = 1 LOCK IN SHARE MODE;


COMMIT;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

适用于只读操作,事务可以读取数据并加共享锁,其他事务仍能读取数据,但不能修改,直到共享锁释放。

3.表级锁

表级锁:在事务操作过程中,对整张表进行锁定,以保证在整个事务操作期间该表不被其他事务修改。

LOCK TABLES products READ;  -- 对 products 表加读锁


SELECT * FROM products;  -- 允许多个事务同时读


-- 其他事务试图 UPDATE、INSERT、DELETE products 表时,会被阻塞


UNLOCK TABLES;  -- 释放锁
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

相比于 行级锁(Row Lock),表级锁的粒度较大,会锁住整张表,从而降低了并发性能,但避免了死锁问题。

在数据一致性非常重要的场景中,例如:金融交易、或库存管理,悲观锁可以确保数据的准确性、和完整性,适合在并发量不高的环境。

责任编辑:武晓燕 来源: mikechen的互联网架构
相关推荐

2023-03-17 16:47:23

索引开发大数据

2018-10-15 16:30:14

数据库索引Mysql

2021-03-30 09:45:11

悲观锁乐观锁Optimistic

2023-01-04 07:54:03

HashMap底层JDK

2024-05-17 09:33:22

乐观锁CASversion

2024-07-25 09:01:22

2024-03-07 07:47:04

代码块Monitor

2024-09-03 15:14:42

2022-12-19 08:00:00

SpringBootWeb开发

2024-01-29 01:08:01

悲观锁递归锁读写锁

2022-05-11 08:53:13

MySQL锁机制

2024-05-13 12:44:00

InnodbMySQL行级锁

2018-07-31 10:10:06

MySQLInnoDB死锁

2023-02-23 10:32:52

乐观锁

2024-01-05 16:43:30

数据库线程

2024-08-28 08:00:00

2023-07-11 08:00:00

2021-01-08 08:34:09

Synchronize线程开发技术

2021-07-23 13:34:50

MySQL存储InnoDB

2019-11-28 16:00:06

重入锁读写锁乐观锁
点赞
收藏

51CTO技术栈公众号