yyz notes yyz notes
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

益章

可乐鸡翅
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

    • 安装MySQL
    • MySql事务
    • MySQL锁
      • 1.1 锁分类
      • 1.2 共享锁和排它锁
      • 1.3 乐观锁和悲观锁
        • 2.3.1 悲观锁:写少读多
        • 2.3.2 乐观锁:读多写少
      • 1.4 行级锁 & 表级锁
    • MySQL索引
    • MySQL慢查询
    • MySQL优化
    • MySQL主从同步
    • mysql主从配置与实战
    • MySQL管理
    • MySQL基本查询
    • mysql基础
    • sql语句面试50题
    • FAQ
  • Redis

  • Elasticsearch

  • MongoDB

  • 消息队列

  • 数据存储
  • MySQL
YiZhang-You
2023-05-01
目录

MySQL锁

# 01.mysql中的锁

# 1.1 锁分类

  • 按使用方式划分:乐观锁、悲观锁

  • 按锁级别划分:共享锁、排他锁

  • 按锁的粒度划分:表级锁、行级锁、页级锁

  • 按操作划分:DML锁,DDL锁

  • 按加锁方式划分:自动锁、显示锁

# 1.2 共享锁和排它锁

  • 共享锁(读锁)

    • 共享锁又叫读锁,如果事务T对A加上共享锁,则其它事务只能对A再加共享锁,不能加其它锁。
    • 获准共享锁的事务只能读数据,不能写数据。
    • 用法: SELECT … LOCK IN SHARE MODE;
  • 排它锁(写锁)

    • 排它锁又叫写锁,如果事务T对A加上排它锁,则其它事务都不能对A加任何类型的锁。获准排它锁的事务既能读数据,又能写数据。
    • 用法 : SELECT … FOR UPDATE

# 1.3 乐观锁和悲观锁

# 2.3.1 悲观锁:写少读多

  • MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞

  • 申请前提:没有线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞。

  • 适用场景:悲观锁适合写入频繁的场景。

对商品数量-1操作,悲观锁实现

  • 每次获取商品时,对该商品加排他锁
  • 也就是在用户A获取获取 id=1 的商品信息时对该行记录加锁,期间其他用户阻塞等待访问该记录。
#### 悲观锁实现加一操作代码
# 我们可以看到,首先通过begin开启一个事物,在获得shop信息和修改数据的整个过程中都对数据加锁,保证了数据的一致性。
'''
begin;
select id,name,stock as old_stock from shop  where id=1 for update;
update shop set stock=stock-1 where id=1 and stock=old_stock;
commit
'''
1
2
3
4
5
6
7
8

# 2.3.2 乐观锁:读多写少

  • 在更新数据的时候需要比较程序中的库存量与数据库中的库存量是否相等,如果相等则进行更新。

  • 反之程序重新获取库存量,再次进行比较,直到两个库存量的数值相等才进行数据更新。

乐观锁实现对商品-1操作

  • 每次获取商品时,不对该商品加锁。
  • 在更新数据的时候需要比较程序中的库存量与数据库中的库存量是否相等,如果相等则进行更新
  • 反之程序重新获取库存量,再次进行比较,直到两个库存量的数值相等才进行数据更新。
#### 乐观锁实现加一操作代码
# 我们可以看到,只有当对数量-1操作时才会加锁,只有当程序中值和数据库中的值相等时才正真执行。
'''
//不加锁
select id,name,stock where id=1;
//业务处理
begin;
update shop set stock=stock-1 where id=1 and stock=stock;
commit;
'''
1
2
3
4
5
6
7
8
9
10

# 1.4 行级锁 & 表级锁

  • 行级锁(写多读少)开销大,加锁慢,锁定粒度最小,发生锁冲突概率最低,并发度最高
  • 表级锁(适合大量的读操作)开销小,加锁快,锁定粒度大、发生锁冲突最高,并发度最低
编辑 (opens new window)
上次更新: 2023/05/17, 23:08:21
MySql事务
MySQL索引

← MySql事务 MySQL索引→

最近更新
01
配置yun源
05-24
02
linux-配置python虚拟环境
05-24
03
linux文件目录管理
05-24
更多文章>
Theme by Vdoing | Copyright © 2023-2023 yizhang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式