MySQL 中的几种锁

三分恶面渣逆袭:MySQL 中的锁

                                                            MySQL 中的锁

#按锁粒度如何划分?

按锁粒度划分的话,MySQL 的锁有:

  • 表锁:开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁。
  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
  • 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
#按兼容性如何划分?

按兼容性划分的话,MySQL 的锁有:

  • 共享锁(S Lock),也叫读锁(read lock),相互不阻塞。
  • 排他锁(X Lock),也叫写锁(write lock),排它锁是阻塞的,在一定时间内,只有一个请求能执行写入,并阻止其它锁读取正在写入的数据。
#按加锁机制如何划分?

①、乐观锁

乐观锁基于这样的假设:冲突在系统中出现的频率较低,因此在数据库事务执行过程中,不会频繁地去锁定资源。相反,它在提交更新的时候才检查是否有其他事务已经修改了数据。

可以通过在数据表中使用版本号(Version)或时间戳(Timestamp)来实现,每次读取记录时,同时获取版本号或时间戳,更新时检查版本号或时间戳是否发生变化。

如果没有变化,则执行更新并增加版本号或更新时间戳;如果检测到冲突(即版本号或时间戳与之前读取的不同),则拒绝更新。

②、悲观锁

悲观锁假设冲突是常见的,因此在数据处理过程中,它会主动锁定数据,防止其他事务进行修改。

可以直接使用数据库的锁机制,如行锁或表锁,来锁定被访问的数据。常见的实现是 SELECT FOR UPDATE 语句,它在读取数据时就加上了锁,直到当前事务提交或回滚后才释放。

#如何解决库存超卖问题?

按照乐观锁的方式:

UPDATE inventory SET count = count - 1, version = version + 1 WHERE product_id = 1 AND version = current_version;

按照悲观锁的方式:

在事务开始时直接锁定库存记录,直到事务结束。

START TRANSACTION;
SELECT * FROM inventory WHERE product_id = 1 FOR UPDATE;
UPDATE inventory SET count = count - 1 WHERE product_id = 1;
COMMIT;

相关推荐

  1. 典型

    2024-07-15 09:12:06       17 阅读
  2. MySQL常见日志类型【重点】

    2024-07-15 09:12:06       49 阅读
  3. 分布式实现方式:

    2024-07-15 09:12:06       45 阅读
  4. 分布式实现方式

    2024-07-15 09:12:06       35 阅读
  5. MySQL

    2024-07-15 09:12:06       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 09:12:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 09:12:06       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 09:12:06       58 阅读
  4. Python语言-面向对象

    2024-07-15 09:12:06       69 阅读

热门阅读

  1. Unity3D中如何降低游戏的Drawcall详解

    2024-07-15 09:12:06       28 阅读
  2. Apache访问机制配置

    2024-07-15 09:12:06       26 阅读
  3. 比较运算符练习·二

    2024-07-15 09:12:06       17 阅读
  4. 什么是幂等?如何实现幂等?

    2024-07-15 09:12:06       24 阅读
  5. 道路运输企业管理人员安全考核试题(附答案)

    2024-07-15 09:12:06       20 阅读
  6. ASCII七位够用为什么用八位表示?

    2024-07-15 09:12:06       19 阅读
  7. 前端面试题日常练-day90 【Less】

    2024-07-15 09:12:06       22 阅读
  8. Linux--DNS 域名解析服务

    2024-07-15 09:12:06       37 阅读