Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

  • MySQL

    • MySQL数据库安装及使用入门
    • SQL语句分类
    • Mysql基础操作
    • Mysql性能测试工具mysqlslap
    • Mysql存储引擎比较
    • Mysql查询慢日志
    • Mysql binlog详解
    • Mysql主从复制
    • Mysql核心知识汇总
    • Mysql中间件MyCat使用
    • Mysql中分表和分区差异
    • MySql表锁、行锁、共享锁、排他锁、乐观锁、悲观锁
      • 表锁
      • 行锁
      • 共享锁
      • 排他锁:
      • 乐观锁
      • 悲观锁
    • 深入理解Mysql复制机制
    • 深入理解Mysql事务
    • 深入理解Mysql索引
    • 谈一谈Mysql分库分表
    • Mysql常见优化技巧
  • Redis

  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • MySQL
Ravior
2017-10-13
目录

MySql表锁、行锁、共享锁、排他锁、乐观锁、悲观锁

# 表锁

  • 锁住整个表。
  • 开销小,加锁快。
  • 不会死锁(一次性加载所需的所有表)。
  • 锁粒度大,发生锁冲突概率大,并发效率低。
  • 适合查询。

# 行锁

  • 锁住一行记录。

  • 开销大,加锁慢。

  • 会死锁。

  • 锁粒度小,发生所冲突概率小,并发效率高。

  • 适合并发写,事务控制。

  • 并不是直接丢记录行加锁,而是对行对应的索引加锁:

  • 如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。

  • 如果sql语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

  • 在InnoDB中,如果SQL语句不涉及索引,则会通过隐藏的聚簇索引来对记录加锁。

  • 对聚簇索引加锁,实际效果跟表锁一样,因为找到某一条记录就得扫描全表,要扫描全表,就得锁定表。

  • MyISAM引擎支持表级锁,不支持行级锁。

  • InnoDB引擎支持表级锁和行级锁,默认为行级锁。

# 共享锁

  • 有称之为S锁、读锁。
  • 当前线程对共享资源加共享锁,其他线程可以读取此资源、可以继续追加共享锁,但是不能修改此资源、不能追加排他锁。
  • 语法:select id from t_table in share mode;
  • 多个共享锁可以共存,共享锁与排他锁不能共存。

# 排他锁:

  • 又称之为X锁、写锁。
  • 当前线程对共享资源加排他锁,其他线程不允许读取此资源,不允许追加共享锁,不允许修改此资源,不允许追加排他锁。
  • 语法:
  • update t_table set a =1; // 数据库的增删改操作默认都会加排他锁
  • select * from t_table for update;// for update也是一种增删改
  • 排他锁是独占的,不会与其他锁共存。

# 乐观锁

  • 乐观地认为,并发问题很难发生。
  • 乐观锁虽然认为并发问题很难发生,但并不是不会发生,所以也会有措施防止问题真的产生:每次数据修改都自增版本号version。
  • 进行数据读取时,并不加锁,而是同时读取当前的版本号version1;在对数据进行修改时,要判断当前的版本号version2是否等于之前的版本号version1。
  • 版本号不匹配,则代表着并发问题已产生,所以需要回滚此次操作。
  • 实现方式:版本号机制、CAS。

# 悲观锁

  • 悲观锁:悲观地认为,并发问题极易发生。
  • 悲观锁认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。
  • 实现方式:数据库的行锁、读锁和写锁。

乐观锁与悲观锁是逻辑上的锁,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,都是悲观锁。

#MySQL
上次更新: 2022/12/01, 11:09:34
Mysql中分表和分区差异
深入理解Mysql复制机制

← Mysql中分表和分区差异 深入理解Mysql复制机制→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式