MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)
前言:元数据锁不是锁定数据,而是锁定描述数据的元数据信息。就像很多装修工人(工作线程)在室内(对象上)装修(操作),不能有其他工人(线程)把屋子拆了(表删除了)。
MySQL 为了数据一致性使用元数据锁来管理并发访问数据库中的对象。元数据锁不仅仅作用于表上,同时对存储程序(schemas,procedure,function,triggers,events)以及表空间都适用。
性能数据库(Performance Schema)中的 metadata_lock 表记录了关于元数据锁的信息。其中可以看到哪个会话持有锁、因为等待锁被堵塞等等。关于这个表的详细信息请看。
- 获得元数据锁
- 释放元数据锁
获得元数据锁
DML语句获得锁的顺序和语句中提及到的表顺序一致。
DDL语句,LOCK TABLES和其他类似语句尝试通过按名称顺序获取显式命名表上的锁来减少并发DDL语句之间可能出现的死锁数。 对于隐式使用的表,可能以不同的顺序获取锁,比如外键关系的表也会被锁。笔者废话:一定要注意其中的名称顺序,实际上就是名称字典序。并非SQL语句中提及到的顺序。
RENAME TABLE tbla TO tbld, tblc TO tbla;
RENAME TABLE tbla TO tblb, tblc TO tbla;
session1 LOCK TABLE x WRITE, x_new WRITE;
session2 INSERT INTO x VALUES(1);
session3 RENAME TABLE x TO x_old, x_new TO x;
session1 UNLOCK TABLES;
mysql> SELECT * FROM x;
+------+ | i |
+------+ | 1 | +------+
mysql> SELECT * FROM x_old;
Empty set (0.01 sec)
session1 LOCK TABLE x WRITE, new_x WRITE;
session2 INSERT INTO x VALUES(1);
session3 RENAME TABLE x TO old_x, new_x TO x;
session1 UNLOCK TABLES;
这时候,猜猜这个数据插入到哪里了。session3获得锁的顺序是new_x, x, old_x。而session2需要x锁。所以session2先插入记录到x中,然后x改名为old_x 。记录是在old_x中。
为确保事务串行化,MySQL不得允许一个会话在另一个会话中未完成的显式或隐式启动的事务中使用的表上,执行数据定义语言(DDL)语句。服务器通过获取事务中使用的表的元数据锁并延迟释放这些锁直到事务结束来实现此目的。 表上的元数据锁可防止更改表的结构。 这种锁定方法的含义是,在事务结束之前,其他会话不能在DDL语句中使用一个会话中的事务正在使用的表。(译者废话:也就说,不允许在对一张表做操作过程中,表的结构被其他线程改了。这是很显然需要保护的)
这个规则不仅仅适用于事务表,对非事务表同样适用。假设一个会话以一个事务表 t 和一个非事务表 启动事务。如下:
START TRANSACTION; SELECT * FROM t; SELECT * FROM nt;
该会话持有t、nt的元数据锁,直到事务结束。如果有其他线程尝试在这两个表上做一个DDL语句(exclusive lock)或者write lock操作。比如,下面的语句都会被堵塞
DROP TABLE t; ALTER TABLE t ...; DROP TABLE nt; ALTER TABLE nt ...; LOCK TABLE t ... WRITE;
如果服务获取语法有效但在执行期间失败的语句的元数据锁,则它不会提前释放锁(“译者注:比如插入冲突”)。 锁定释放仍然延迟到事务结束,因为失败的语句被写入二进制日志,并且锁定保护日志一致性。
在autocommit = true 的情况下,语句执行完,元数据锁就释放了。
MySQL metalock的一些技巧(写大于读的案例,以及获得锁的顺序)的更多相关文章
- 线上MySQL读写分离,出现写完读不到问题如何解决
大家好,我是历小冰. 今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc.MyCat 和 MaxScale 等开源数据库 ...
- phpexcel如何读和写大于26列的excel
主要运用到PHPExcel_Cell类的两个方法 1读取excel大于26列时. PHPExcel_Cell::columnIndexFromString($highestColumm)://由列名转 ...
- 【mysql注入】mysql注入点的技巧整合利用
[mysql注入]mysql注入点的技巧整合利用 本文转自:i春秋社区 前言: 渗透测试所遇的情况瞬息万变,以不变应万变无谓是经验与技巧的整合 简介: 如下 mysql注入点如果权限较高的话,再知道w ...
- MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...
- MySQL数据库调优技巧
原文链接:https://m.aliyun.com/bbs/read/300762.html MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它 ...
- MySQL优化十大技巧
转自:https://m.2cto.com/database/201701/557910.html MYSQL优化主要分为以下四大方面: 设计:存储引擎,字段类型,范式与逆范式 功能:索引,缓存,分区 ...
- mysql幻读、MVCC、间隙锁、意向锁(IX\IS)
IO即性能 顺序主键写性能很高,由于B+树的结构,主键如果是顺序的,则磁盘页的数据会按顺序填充,减少数据移动,随机主键则可能由于记录移动产生很多io 查询二级索引时,会再根据主键id获取数据页,产生一 ...
- 如何基于LSM-tree架构实现一写多读
一 前言 PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性.海量存储.高性能.低成本的数据库服务.X-Engine是阿里巴 ...
- C#向文件写、读数据
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- Highcharts纯js图表库,以后可以跟客户说,你跟阿里云ECS用的图表库是同款
Highcharts是一款纯javascript编写的图表库,能够很简便的在Web网站或Web应用中添加交互性的图表,Highcharts目前支持直线图.曲线图.面积图.柱状图.饼图.散点图等多达18 ...
- springboot 配置拦截器
1 有这样一个需求 服务端对部分请求URL需要验证身份.如果验证错误,停止请求,按照既定的数据格式返回:如果验证正确,继续执行请求. 2 需要这样做 1. 将指定格式的请求拦截下来: 2. 获取参数, ...
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)--切换摄像头,延时拍摄和闪光模式 一.切换摄像头 在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新 ...
- WPF/Silverlight 页面绑定Model验证机制升级版
关于WPF/Silverlight的数据验证,想必大家都不陌生了. 各大牛的博客里都不泛对这方面讨论的文章. 个人比较赞赏 JV9的“Silverlight实例教程”里的Validation数据验证. ...
- UltraEdit实现“删除包含某个关键字的所有行”
原文:UltraEdit实现"删除包含某个关键字的所有行" UltraEdit实现"删除包含某个关键字的所有行" 1.Ctrl+R调出"替换对话框 ...
- 利用Socket通信
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...
- CoolFormat(Qt Creator也可管理VC的Project)
http://download.csdn.net/download/akof1314/8457593 https://github.com/akof1314/CoolFormat http://dow ...
- Qt 下快速读写Excel指南(尘中远)
Qt Windows 下快速读写Excel指南 很多人搜如何读写excel都会看到用QAxObject来进行操作,很多人试了之后都会发现一个问题,就是慢,非常缓慢!因此很多人得出结论是QAxObjec ...
- Linux可以把vmdk当做磁盘加载进去
VMware虚拟机由于停电,无法启动MAC系统 下午的时候,正在开发ios app,结果停电了.当时还不知道,伴随而来的灾难竟然折腾了好几天,真是心力交瘁. 我是在VMware虚拟机下装的Mac os ...
- QT中的各种对话框
大家可以参见QT中各种MessageBox的使用的这篇文章 界面效果图如下,大家可以用代码自己操作 diglog.h #ifndef DIALOG_H #define DIALOG_H #includ ...