zoukankan      html  css  js  c++  java
  • 一文让你彻底搞懂 MySQL 的几种锁

    文章来源:51CTO博客,作者:青苔初生

    一文读懂所有锁,了解他们的优缺点和使用场景。

    表级锁与行级锁

    表级锁:

    table-level locking,锁住整个表。

    开销小,加锁快。

    不会死锁(一次性加载所需的所有表)。

    锁粒度大,发生锁冲突概率大,并发效率低。

    适合查询。

    行级锁:

    row-level loking,锁住一行记录。

    开销大,加锁慢。

    会死锁。

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

    适合并发写,事务控制。

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

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

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

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

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

    引擎与锁:

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

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

    共享锁与排他锁

    共享锁:

    有称之为S锁、读锁。

    当前线程对共享资源加共享锁,其他线程可以读取此资源、可以继续追加共享锁,但是不能修改此资源、不能追加排他锁。

    语法:select id from t_table in share mode;

    多个共享锁可以共存,共享锁与排他锁不能共存。

    排他锁:

    又称之为X锁、写锁。

    当前线程对共享资源加排他锁,其他线程不允许读取此资源,不允许追加共享锁,不允许修改此资源,不允许追加排他锁。

    语法:

           1. update t_table set a =1; // 数据库的增删改操作默认都会加排他锁

           2. select * from t_table for update;// for update也是一种增删改

    排他锁是独占的,不会与其他锁共存。

    乐观锁与悲观锁

    乐观锁与悲观锁是逻辑上的锁。

    乐观锁:

    乐观锁:乐观地认为,并发问题很难发生。

    乐观锁虽然认为并发问题很难发生,但并不是不会发生,所以也会有措施防止问题真的产生:每次数据修改都自增版本号version。

    进行数据读取时,并不加锁,而是同时读取当前的版本号version1;在对数据进行修改时,要判断当前的版本号version2是否等于之前的版本号version1。

    版本号不匹配,则代表着并发问题已产生,所以需要回滚此次操作。

    实现方式:版本号机制、CAS。

    悲观锁:

    悲观锁:悲观地认为,并发问题极易发生。

    悲观锁认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。

    实现方式:数据库的行锁、读锁和写锁。

    最后,特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!

    还没关注的小伙伴,可以长按关注一下:


     
  • 相关阅读:
    最高效的无限级菜单生成方法
    MySQL性能优化的最佳20+条经验(转)
    Web应用中的轻量级消息队列
    Delphi Setlength 内存释放总结
    Delphi 的TSpeedButton按下和弹起效果
    Delphi存取图像完整解决方案
    delphi 开机自动运行代码
    有关时间限制使用和软件注册的设计(delphi)
    Linux环境thinkphp配置以及数据源驱动改动
    Dalvik和ART简单介绍
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14582160.html
Copyright © 2011-2022 走看看