首页 > 数据库 >MySQL——锁

MySQL——锁

时间:2023-01-08 15:44:35浏览次数:43  
标签:MDL 行锁 lock 死锁 线程 MySQL

1、全局锁

全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

全局锁的典型使用场景是,做全库逻辑备份。

2、表锁

MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。表锁的语法是 lock tables … read/write。与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。

另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。MDL 的作用是,保证读写的正确性。事务中的 MDL 锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放。

MDL 会直到事务提交才释放,在做表结构变更的时候,你一定要小心不要导致锁住线上查询和更新。

 

3、行锁

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

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

 

  • 死锁

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

当出现死锁以后,有两种策略:

一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。

另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。

标签:MDL,行锁,lock,死锁,线程,MySQL
From: https://www.cnblogs.com/shog808/p/17034746.html

相关文章

  • mysql字符集&编码问题
    1.mysql各编码变量含义使用showvariableslike'character%'后检查出mysql中有若干编码:●character_set_client客户端来源数据使用的字符集,也就是客户端发过来的que......
  • mysql数据库系统​
    拓补图​推荐步骤​在centos01上安装Mysql数据库服务,生成服务部器其配置文件,添加系统服务优化命令初始化mysql设置访问密码登录mysql数据库​在centos01的mysql服务器上创建......
  • 如何去掉 node.js 获取MySQL数据产生的RowDataPacket
    如何去掉node.js获取MySQL数据产生的RowDataPacket利用JSON.stringify()把对象转为对象字符串,可去掉RowDataPacket。router.post('/login',function(req,res){......
  • MySQL18 - 基础操作进阶
    INSERT插入多条记录INSERTINTOt_user (id,name,birth,create_time)VALUES (3,'hehe','1990-01-01',NOW()), (4,'haha','1990-01-01',NOW()), (5,'@@',......
  • MySql中json类型数据的查询以及在MyBatis-Plus中的使用
    表结构和初始数据新建表结构CREATETABLE`json_test`(`id`intNOTNULLAUTO_INCREMENT,`roles`jsonDEFAULTNULLCOMMENT'角色',`project`jsonDEFAULTNULL......
  • MySQL17 - DML基本语法 - 增删改
    DML基本语法-增删改DATE和DATETIME两个类型的区别DATE是短日期:只包括年-月-日默认格式:%Y-%m-%dDATETIME是长日期:包括年-月-日-时-分-秒默认格式:%Y-......
  • MySQL数据库提权之UDF提权和MOF提权
    UDF提权概念:udf的设计初衷是为了方便用户自定义一些函数,方便查询一些复杂的数据,同时也增加了使用udf提权的可能。攻击者通过编写调用cmd或者shell的udf.dll文件,并且导入......
  • MySQL16 - DDL基本语法
    DDL基本语法创建学生表,包括学号、姓名、年龄、性别、邮箱地址CREATETABLEt_student( noINT, nameVARCHAR(32), sexCHAR(1)DEFAULT'm', ageINT(3), emailV......
  • MYSQL在Linux的安装
    MYSQL在Linux的安装Centos7centos默认带有mariadb,与mysql冲突1、检测当前系统中是否安装MySQLrpm-qa|grepmysql2、卸载已经安装的冲突软件rpm-e--n......
  • Oracle官网下载MySql
    第一步:进入Oracle官网地址第二步:在Products中点击MySQL   第三步:点击DOWNLOADS第三步:点击MySQLCommunity(GPL)Downloads  第四步:点击MySQLCommunitySe......