开发者社区> 问答> 正文

MySQL锁,悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁都是什么

MySQL锁,悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁都是什么

展开
收起
xiawang1024 2021-10-14 17:15:05 13131 0
2 条回答
写回答
取消 提交回答
  • 即使是搬砖,也要有自己的姿势

    从数据库系统共享数据资源的角度考虑比较容易理解。数据库的主要功能是管理数据,那么在多事务操作同一条记录数据的时候,为了避免脏读 不可重复读 幻读等问题,势必要对数据进行加锁,那数据库有分为 库纬度 表纬度 行纬度 字段纬度 这几个方面,所以就会出现很多种锁的类型。

    所以 行级锁 和 表级锁就很容易理解了,就是记录行和表上的锁。

    共享锁 又称 s锁,主要是查询类的操作,可以事务与事务之间并发执行的,但也要有锁。 排它锁 又称x锁,主要是更新类的事务操作,排它锁与排它锁互斥,与共享锁也互斥。

    乐观锁和悲观锁是另外一种纬度,是针对操作人来讲的,操作人对当前的事务操作是否每次操作都加锁 还是通过版本号的方式循环判断数据的正确性。

    还有一种意向锁,个人理解是数据库的一种优化,行级锁和表级锁 每次事务查询当前表是否有锁时 都要查询太多的东西,但是有了表级别的意向锁,只需判断当前表上是否有意向锁就知道当前表是否有排它锁

    2021-10-15 17:51:05
    赞同 展开评论 打赏
  • 网络规划设计师、敏捷专家、CISP、ITSS服务经理、ACA全科目、ACP4项、ACE、CBP、CDSP、CZTP等。拥有 PRINCE2 Foundation/Practitioner、CCSK、ITIL、ISO27001、PMP等多项国际认证。 专利5+、期刊10+、知识产权师。核心期刊审稿人。

    您好,相关解释如下

    1.表级锁与行级锁

    表级锁:

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

    行级锁:

    row-level loking,锁住一行记录。
    开销大,加锁慢。
    会死锁。
    锁粒度小,发生所冲突概率小,并发效率高。
    适合并发写,事务控制。
    并不是直接丢记录行加锁,而是对行对应的索引加锁:
        如果sql 语句操作了主键索引,Mysql 就会锁定这条主键索引。
        如果sql语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。
        在InnoDB中,如果SQL语句不涉及索引,则会通过隐藏的聚簇索引来对记录加锁。
        对聚簇索引加锁,实际效果跟表锁一样,因为找到某一条记录就得扫描全表,要扫描全表,就得锁定表。
    
    

    引擎与锁:

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

    2.共享锁与排他锁

    共享锁:

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

    排他锁:

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

    3.乐观锁与悲观锁

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

    乐观锁:

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

    悲观锁:

    悲观锁:悲观地认为,并发问题极易发生。
    悲观锁认为并发问题极易发生,所以每次操作,无论读写,都会对记录加锁,以防止其他线程对数据进行修改。
    实现方式:数据库的行锁、读锁和写锁。
    
    
    2021-10-15 08:42:56
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像