首页 > 其他分享 > 06、07 | 全局锁、表锁和行锁

06、07 | 全局锁、表锁和行锁

时间:2023-06-26 23:35:22浏览次数:38  
标签:事务 06 07 行锁 lock 死锁 线程 表锁

06、07 | 全局锁、表锁和行锁

MySQL 中的锁大致分为全局锁、表锁和行锁。

全局锁

全局锁就是对整个数据库实例加锁。

加全局锁命令:Flush tables with read lock(FTWRL),执行该命令会让整个库处于只读状态。

Flush tables with read lock;

使用场景: 做全库逻辑备份。

有了 MVCC 的支持,为什么还需要 FTWRL ?

一致性读是存储引擎提供的,但不是所有引擎都支持事务。

还有一种方式可以实现全库只读。

set global  read_only  = true;

但建议使用 FTWRL 来完成全库只读。原因如下:

  • 在有些系统中, readonly 的值被用来做其他逻辑。如判断一个库是备库还是主库。
  • 异常处理机制上存在差异。
    • 如果执行 FTWRL 命令之后由于客户端异常断开,MySQL 会自动释放这个全局锁。
    • 整库设置为 readonly 之后,如果客户端发生异常,则数据库会一直会保持 readonly 状态,风险较高。

表级锁

表锁一般是在数据库引擎不支持行锁的时候才会被用到的。

MySQL 中表级锁有两种:

  • 表锁
  • 元数据锁(meta data lock,MDL)

表锁

语法:

加锁:lock table ... read/write;

释放锁:

  • 执行:unlock tables;

  • 客户端断开时主动释放

-- 对 user 表加读锁
lock tables user read;
-- 对 userinfo 表加写锁
lock tables userinfo write;
-- 释放锁
unlock tables;

特点:

表锁类型 当前线程 其他线程
读锁 只能读取,不能修改 只能读取,不能修改
写锁 能读写 不能读,更不能写

MDL 锁

MDL 不需要显式使用,在访问一个表的时候会被自动加上。

作用:保证读写的正确性。用于隔离 DML 和 DDL 操作之间的干扰。

DML 操作需要加 MDL 读锁。

DDL 操作需要加 MDL 写锁。

加锁时机:事务中的 MDL 锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放

行锁

MySQL 的行锁是在引擎层由各个引擎自己实现的。并不是所有的引擎都支持行锁。

行锁就是针对数据库表中行记录的锁。

两阶段锁协议

在 InnoDB 事务中,行锁是在需要的时候加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。

知道了这个规则,在实际使用中,如果事务中需要锁多个行,要把最可能造成锁冲突,最可能影响并发度的锁尽量往后放。

死锁与死锁检测

当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程进入无限等待的状态,称谓死锁。

出现死锁后的两种策略:

  • 直接进入等待,直到超时。超时时间可以通过 innodb_lock_wait_timeout 来设置。

    show variables like 'innodb_lock_wait_timeout';
    
  • 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。(默认开启)

    show variables like 'innodb_deadlock_detect';
    

在 InnoDB 中, innodb_lock_wait_timeout 默认值为 50s,意味着如果采用第一个策略,出现死锁后,第一个被锁住的线程要超过 50s 才会超时退出,其他线程才有可能继续执行。对于在线服务来说,这个等待时间往往无法接受。但是,如果把这个时间设置为一个很小的值,会出现很多误伤。所以,正常情况下,我们一般采用主动死锁检测策略

对于所有事务都更新同一行的场景。每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度为 O(n) 的操作。假设有 1000 个并发线程要同时更新同一行,那么死锁检测操作就是 100 万这个量级的。在这期间要消耗大量的 CPU资源。此时现象就是 CPU 利用率很高,但是每秒执行不了几个事务。

如何解决热点行更新导致的性能问题呢

问题的症结在于,死锁检测要耗费大量的 CPU 资源。

减少死锁的主要方向,就是控制访问相同资源的并发事务量。

  • 确保业务一定不会出现死锁,临时把死锁检测关掉。
  • 控制并发度,这样死锁检测的成本很低。
  • 将一行改成逻辑上的多行来减少锁冲突。

标签:事务,06,07,行锁,lock,死锁,线程,表锁
From: https://www.cnblogs.com/sun-yanglu/p/17507431.html

相关文章

  • Python全栈学习 day07 数据类型(三)
    day06数据类型(下)常见的数据类型:int,整数类型(整形)bool,布尔类型str,字符串类型list,列表类型tuple,元组类型dict,字典类型set,集合类型float,浮点类型(浮点型)目标:掌握字典、集合、浮点类型相关知识。课程概要:set集合,一个不允许重复重复&可变类型(元素可哈希)。dict字典,一个......
  • SAP BTP 平台 ABAP 编程环境如何维护自定义 Unit Of Measure 数据库表 T006
    在ABAPOn-Premises系统下,我们可以轻易在SAPGUI里对UnitofMeasure数据库表即T006进行维护:[图片]ABAP数据库表T006是SAP系统中的一个重要数据表,它用于存储与度量单位相关的信息。在SAP系统中,度量单位用于表示各种物料、服务和计量单位。这些信息对于物料管理、......
  • Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重要更新最新音频课程现已发布近期,我们......
  • AtCoder Beginner Contest 307 Ex Marquee
    洛谷传送门AtCoder传送门一开始看错题了,看了好久才发现就是个板子。。。这个东西本质上是循环移位,我们考虑在\(S\)前后各添加\(W-1\)个.,例如\(W=5,S=\texttt{ABC}\)时,添加后\(S=\texttt{....ABC....}\)。此时我们发现\(S\)的每个长度为\(W\)的子串一一对......
  • AtCoder Beginner Contest(abc) 307
    A-WeeklyRecords题目大意小莫每天跑步,输入n周每天的步数,输出每周跑的总步数;解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m,k,idx;signedmain(){ cin>>n; intsum=0; for(inti......
  • UPC325AE01  3BHB000644R0001提供了一个菜单驱动的控制台界面或命令行界面
    UPC325AE01 3BHB000644R0001提供了一个菜单驱动的控制台界面或命令行界面UPC325AE01 3BHB000644R0001提供了一个菜单驱动的控制台界面或命令行界面 对于工业以太网交换机的管理都是采用控制台的管理模式与ie浏览的向导模式以及网管软件相结合。以下描述一下这三种管理方......
  • C/C++航空客运订票系统[2023-06-26]
    C/C++航空客运订票系统[2023-06-26]实验1航空客运订票系统问题描述:航空客运订票的业务活动包括查询航线和客票预订的信息、客票预订和办理退票等,设计一个程序使上述任务借助计算机来完成。基本要求:(一)系统必须存储的数据信息。1.信息:飞机抵达的城市、航班号、飞机号、起降......
  • vue07进阶
    Vue开始什么是vue?Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue都可以胜任。下面是一个最基本的示例:import{createApp}from'vu......
  • vue06_前端工程化
    今日目标1.能够了解模块化的相关规范2.了解webpack3.了解使用Vue单文件组件4.能够搭建Vue脚手架5.掌握Element-UI的使用1.模块化的分类A.浏览器端的模块化1).AMD(AsynchronousModuleDefinition,异步模块定义)​代表产品为:Require.js​2).CMD(CommonModuleDefi......
  • Selenium基础:特殊Dom结构操作 07
    特殊Dom结构是指对元素不能直接操作,需要进行特殊定位切换到它所在的Dom结构,然后才能对其元素进行操作1、windows弹窗--alertconfirmprompt使用driver.switch_to.alert方法alert类操作方法:accept():确定dismiss():取消text():获取弹出框内的内容send_keys(keysToSend):输入......