首页 > 数据库 >mysql:聊聊mysql中的锁八股文,锁分类,表锁(s锁,x锁,意向锁,自增锁,元数据锁)行锁(记录锁,间隙锁,临键锁,插入意向锁)乐观锁,悲观锁,显示锁,隐式锁

mysql:聊聊mysql中的锁八股文,锁分类,表锁(s锁,x锁,意向锁,自增锁,元数据锁)行锁(记录锁,间隙锁,临键锁,插入意向锁)乐观锁,悲观锁,显示锁,隐式锁

时间:2023-02-06 10:31:51浏览次数:40  
标签:自增锁 意向锁 写锁 读锁 线程 悲观 mysql 数据


mysql:锁分类,表锁(s锁,x锁,意向锁,自增锁,元数据锁)行锁( 记录锁,间隙锁,临键锁,插入意向锁)乐观锁,悲观锁,显示锁,隐式锁

1从数据操作的类型划分:读锁、写锁

  • 读锁
    读锁 :也称为 共享锁 、英文用 S 表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。
  • 写锁
    写锁 :也称为 排他锁 、英文用 X 表示。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。

2从数据操作的粒度划分:表级锁、页级锁、行锁

2.1表级锁

  • 表级别的S锁、X锁
LOCK TABLES t READ :InnoDB存储引擎会对表 t 加表级别的 S锁 。
LOCK TABLES t WRITE :InnoDB存储引擎会对表 t 加表级别的 X锁
  • 意向锁 (intention lock)
-- 事务要获取某些行的 S 锁,必须先获得表的 IS 锁。
SELECT column FROM table ... LOCK IN SHARE MODE;
-- 事务要获取某些行的 X 锁,必须先获得表的 IX 锁。
SELECT column FROM table ... FOR UPDATE;
  • 自增锁(AUTO-INC锁)
    保证正常新增数据
  • 元数据锁(mdl)
    保证在修改表结构时不能对数据进行修改。

2.2行级锁

  • 记录锁
  • 间隙锁
  • 临键锁
  • 意向插入锁

2.3页锁

3从对待锁的态度划分:乐观锁、悲观锁

悲观锁
悲观锁是一种思想,顾名思义,就是很悲观,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 阻塞 直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,当其他线程想要访问数据时,都需要阻塞挂起。Java中 synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现。

乐观锁
乐观锁认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,也就是不采用数据库自身的锁机制,而是通过程序来实现。在程序上,我们可以采用 版本号机制 或者 CAS机制 实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量。在Java中 java.util.concurrent.atomic 包下的原子变量类就是使用了乐观锁begin;select * from student where id <=8 and id > 3 for update;的一种实现方式:CAS实现的。
通过时间戳,或者版本号来实现,在程序上的控制

4显示锁,隐式锁

显示锁就是我们手动加的可见的

隐式锁,对聚簇索引上有trx_id字段,记录当前记录是否在其他事务中活跃


标签:自增锁,意向锁,写锁,读锁,线程,悲观,mysql,数据
From: https://blog.51cto.com/u_15601494/6038722

相关文章

  • mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。
    mysql:聊聊mysql学完之后心得,从哪里学,学哪些,怎么选课程,学到什么程度。学习完一套课程之后习惯性总结一下。首先说一下,咕咕是跟着尚硅谷的康老师学习的mysql,大家想学习的话可......
  • java 和mysql 开发中的数据处理浅谈
    我们在开发过程中经常会用到java和mysql,两者都能处理数据。那么什么时候用这两个,或者在特定的情况下使用正确的工具,发挥工具的本身的特点提高开发的效率就显得尤为重要。j......
  • apollo源码同时兼容mysql、postgresql、oracle解决思路
    本文摘录apollo源码采用的是jpa规范Hibernate进行持久化的ORM框架解决思路:思路一:使用jpa配置文件persistence.xml文件,根据使用的数据库动态加载实体类与数据库中实体......
  • Oracle版面本的MySQL8.0的配置文件 my.cnf
    ##############################  [client]port=3306socket=/home/work/mysql_3306/tmp/mysql.sock[mysqld]#在mysql8.0以上版本默认为caching_sha2_passwo......
  • mysql基础知识
    1、sql注入sql注入就是通过把sql命令注入到后台数据库执行一些恶意的操作。注入方式比如通过web表单提交一些恶意字符串。比如用户做登录验证的时候,我们可能会根据用户填......
  • mysql_gtid学习笔记
    一、GTID概述GTID是MYSQL5.6新增的特性,GTID(GlobalTransactionIdentifier)全称为全局事务标示符,用以数据库实例事务唯一标识,其组成主要是source_id和transaction_id即GT......
  • php7 安装mysqli实例讲解
    php7怎么安装Mysqli?Centosphp7安装mysqli扩展心得在新配服务器时发现,php无法连接到mysql。通过phpinfo发现。根本没有显示mysqli的相关配置。经过一系列研究。总结了......
  • [MySQL] 《数据库系统概念》阅读笔记
    第二章关系数据库在关系模型(relationalmodel)中,关系用来指代表(table),元组用来指代行(row),表中的一行代表了一组值之间的一种联系,行中的每一列(column)代表一个属性,属性允许的......
  • mac-docker安装使用mysql
    参考:https://blog.csdn.net/m0_67402588/article/details/1260751861、下载镜像,注意这里要下载适配了arm架构的镜像源dockerpullmysql/mysql-server2、创建容器dock......
  • 为若依逆向工程创建mysql视图
    createviewview_jin_xiao_cun2asSELECTa.jiezhuan_prod_codeasprod_code,a.jiezhuan_prod_nameasprod_name,IFNULL(b.jiezhuan_count,0)asqichu_count,IFNULL......