MySQL学习笔记(八)—— 锁

        首先要说明,有的锁是我们自己想加的时候加的,比如全局锁要靠我们自己用命令去加。而有的锁是mysql默认就给你加上了,因为mysql要保证自己最起码的安全性。

        InnoDB默认加的是行级锁。

一、全局锁

1.1 用途

全局锁就是把所有的表都给锁了,想一想什么业务能用到所有的表呢?肯定不是平常的增删改查的业务,只有整个库拷贝的时候。为了防止拷贝的时候有人动了表结构或者动了表数据,我们就直接把整个库都给锁了,这样就能保证从库和主库的数据完全一致。

执行flush tables with read lock命令后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞:

  • 对数据的增删改操作,比如 insert、delete、update等语句;

  • 对表结构的更改操作,比如 alter table、drop table 等语句。

1.2 命令

# 使用全局锁
flush tables with read lock# 解开全局锁
unlock tables

当然,当数据库client的连接断开时,会自动解锁(不然要是MySQL的client一直不来连接,还能锁一辈子啊?跟TCP三次握手的思想有点像哈)

1.1 特点

加全局锁期间,整个库都只能处理读业务,其他insert,update,delete都得被阻塞。如果库很大,拷贝的时间很长,就。。。

二、表级别的锁

注意区分表级锁和表锁,表级锁代表的是以下一类表级别的锁,而表锁就是表锁。

2.1 分类

  • 表锁
    • 分为读锁和写锁
    • 读读共享,读写互斥,写写互斥。不能写好理解,不能读是因为另一个线程可能会读脏数据、幻读、不可重复读等问题
  • 元数据锁(MDL):线程1对一张表进行读写CRUD时,加的是元数据锁,防止线程2修改表结构。这里可以把“元数据”的“元”直接理解为表结构的意思,所以元数据锁就是给表结构加锁。
  • 意向锁:当一个线程想要给一个表加表锁时,就要先遍历每一条记录,看一看有没有被加行锁的记录,当所有行都没有行锁时,才能加表锁,这样效率太低了!所以有了意向锁,意向锁就起到一个flag的作用而已。当一个线程想要给一个表的行加行锁时,就先给这个表加一个意向锁,那么另一个线程想要加表锁前,看一下有没有意向锁就行,就不用全表扫描了。所以意向锁的作用就是快速判断表里是否有记录被加锁。

三、行级锁

3.1 分类

行级锁的类型主要有四类:

  • 记录锁,Record Lock,也就是仅仅把一条记录锁上;

  • 间隙锁,Gap Lock,锁定一个范围,但是不包含记录本身。可以形象地理解,因为没有锁记录,只是锁了记录的边边,所以叫间隙锁。

  • Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

  • 插入意向锁:一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁或next-key lock 也包含间隙锁)。如果有的话,插入操作就会去排队阻塞等待,直到拥有间隙锁的那个事务提交为止(释放间隙锁的时刻),在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。

3.2 命令

//对读取的记录加共享锁
select ... lock in share mode;//对读取的记录加排它锁
select ... for update;

解疑答惑

之前只学了共享锁(读锁)和排它锁(写锁),属于上面的全局锁,表级锁还是行级锁呢?

都不属于,因为共享锁和排它锁只是一个概念,表级锁可以是共享锁也可以是排它锁,行级锁也可以是共享锁或排它锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88212.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ceph源码解析:PG peering

集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢复,让所有的副本都达到一致的状态。 一、OSD的故障和处理办法: 1. OSD的故障种类: 故障A:一…

微服务(多级缓存)

目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.2.初识Caffeine 2.3.实现JVM进程缓存 2.3.1.需求 2.3.2.实现 3.Lua语法入门 3.1.初识Lua 3.1.HelloWorld 3.2.变量和循环 3.2.1.Lua的数据类型 3.2.2.声明变量 3.2.3.循环 3.3.条件控制、函数 3.3.1.函数 3.3.…

网关认证的技术方案

我们认证授权使用springsecurity 和oauth2技术尽心实现具体实现流程见第五章文档,这里就是记录一下我们的技术方案 这是最开始的技术方案,我们通过认证为服务获取令牌然后使用令牌访问微服务,微服务解析令牌即可。但是缺点就是每个微服务都要…

【进阶篇】MySQL 存储引擎详解

文章目录 0.前言1.基础介绍2.1. InnoDB存储引擎底层原理InnoDB记录存储结构和索引页结构InnoDB记录存储结构:InnoDB索引页结构: 3. MVCC 详解3.1. 版本号分配:3.2. 数据读取:3.3. 数据写入:3.4. 事务隔离级别&#xff…

软件开发企业SDL安全培训案例

1.背景 随着计算机技术的发展、internet及mobile应用的普遍使用,软件安全像功能、性能、稳定性一样是计算机系统的一个非常重要部分。没有安全的软件,任何美好的功能都是徒劳的,没有安全的软件,公司的机密数据、客户隐私、系统的可靠性都得不到保障.如何有效评估、开发安全、可…

ant-vue1.78版监听a-modal遮罩层的滚动事件

监听a-modal遮罩层的滚动事件 我们开发过程中经常有遇到监听页面滚动的事件需求,去做一些下拉加载或者是下拉分页的需求,我们直接在vue的生命周期中去绑定事件监听非常的方便,但如果是弹框的遮罩层的滚动监听呢?页面的监听完全是…

什么是synchronized的重量级锁

今天我们继续学习synchronized的升级过程,目前只剩下最后一步了:轻量级锁->重量级锁。 通过今天的内容,希望能帮助大家解答synchronized都问啥?中除锁粗化,锁消除以及Java 8对synchronized的优化外全部的问题。 获…

云计算——虚拟化中的网络架构与虚拟网络(文末送书)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 前期回顾 前言 一.网卡虚拟化 1.网卡虚拟化方法&…

海康威视相机-LINUX SDK 开发

硬件与环境 相机: MV-CS020-10GC 系统:UBUNTU 22.04 语言:C 工具:cmake 海康官网下载SDK 运行下面的命令进行安装 sudo dpkg -i MVSXXX.deb安装完成后从在/opt/MVS 路径下就有了相关的库,实际上我们开发的时候只需要…

CausalEGM:通过编码生成建模的通用因果推理框架

英文题目:CausalEGM: a general causal inference framework by encoding generative modeling 中文题目:CausalEGM:通过编码生成建模的通用因果推理框架 单位:斯坦福大学统计系 时间:2023 论文链接:ht…

ceph对象三元素data、xattr、omap

这里有一个ceph的原则,就是所有存储的不管是块设备、对象存储、文件存储最后都转化成了底层的对象object,这个object包含3个元素data,xattr,omap。data是保存对象的数据,xattr是保存对象的扩展属性,每个对象…

java+ssm+mysql农场信息管理系统

项目介绍: 本系统为基于jspssmmysql的农场信息管理系统,功能如下: 用户:注册登录系统,菜地信息管理,农作物信息管理,种植信息管理,客户信息管理,商家信息管理&#xff…