背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的Metatdata 锁,极易出现复制中断,例如如下执行序列: Session 1: BEGIN; Session 1: INSERT INTO t1 VALUES (1); Session 2: Drop ta
背景
引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的Metatdata 锁,极易出现复制中断,例如如下执行序列:
Session 1: BEGIN;
Session 1: INSERT INTO t1 VALUES (1);
Session 2: Drop table t1; --------SQL写入BINLOG
Session 1: COMMIT; -----事务写入BINLOG
在备库重放 binlog时,会先执行DROP TABLE,再INSERT数据,从而导致复制中断。
在MySQL 5.5版本里,引入了MDL, 在事务过程中涉及到的所有表的MDL锁,直到事务结束才释放。这意味着上述序列的DROP TABLE 操作将被Session 1阻塞住直到其提交。
不过用过5.5的人都知道,MDL实在是个让人讨厌的东西,相信不少人肯定遇到过在使用mysqldump做逻辑备份时,由于需要执行FLUSH TABLES WITH READ LOCK (以下用FTWRL缩写代替)来获取全局GLOBAL的MDL锁,因此经常可以看到“wait for global read lock”之类的信息。如果备库存在大查询,或者复制线程正在执行比较漫长的DDL,并且FTWRL被block住,那么随后的QUERY都会被block住,导致业务不可用引发故障。
为了解决这个问题,Facebook为MySQL增加新的接口替换掉FTWRL 只创建一个read view ,并返回与read view一致的binlog位点;另外Percona Server也实现了一种类似的办法来绕过FTWRL,具体点击文档连接以及percona的博客,不展开阐述。
MDL解决了bug#989,却引入了一个新的热点,所有的MDL锁对象被维护在一个hash对象中;对于热点,最正常的想法当然是对其进行分区来分散热点,不过这也是Facebook的大神Mark Callaghan在report了bug#66473后才加入的,当时Mark观察到MDL_map::mutex的锁竞争非常高,进而推动官方改变。因此在MySQL 5.6.8及之后的版本中,引入了新参数metadata_locks_hash_instances来控制对mdl hash的分区数(Rev:4350);
不过故事还没结束,后面的测试又发现哈希函数有问题,somedb. someprefix1 … .somedb .someprefix8 的hash key值相同,都被hash到同一个桶下面了,相当于hash分区没生效。这属于hash算法的问题,喜欢考古的同学可以阅读下bug#66473后面Dmitry Lenev的分析。
Mark进一步的测试发现Innodb的hash计算算法比my_hash_sort_bin要更高效, Oracle的开发人员重开了个bug#68487来跟踪该问题,并在MySQL5.6.15对hash key计算函数进行优化,包括fix 上面说的hash计算问题(Rev:5459),使用MurmurHash3算法来计算mdl key的hash值。
MySQL 5.7 对MDL锁的优化
在MySQL 5.7里对MDL子系统做了更为彻底的优化。主要从以下几点出发:
第一,尽管对MDL HASH进行了分区,但由于是以表名+库名的方式作为key值进行分区,如果查询或者DML都集中在同一张表上,就会hash到相同的分区,引起明显的MDL HASH上的锁竞争。
针对这一点,引入了LOCK-FREE的HASH来存储MDL_lock,LF_HASH无锁算法基于论文"Split-Ordered Lists: Lock-Free Extensible Hash Tables",实现还比较复杂。 注:实际上LF_HASH很早就被应用于Performance Schema,算是比较成熟的代码模块。由于引入了LF_HASH,MDL HASH分区特性自然直接被废除了 。对应WL#7305, PATCH(Rev:7249)
第二,从广泛使用的实际场景来看,DML/SELECT相比DDL等高级别MDL锁类型,是更为普遍的,因此可以针对性的降低DML和SELECT操作的MDL开销。
为了实现对DML/SELECT的快速加锁,使用了类似LOCK-WORD的加锁方式,称之为FAST-PATH,如果FAST-PATH加锁失败,则走SLOW-PATH来进行加锁。
每个MDL锁对象(MDL_lock)都维持了一个long long类型的状态值来标示当前的加锁状态,变量名为MDL_lock::m_fast_path_state 举个简单的例子:(初始在sbtest1表上对应MDL_lock::m_fast_path_state值为0)
Session 1: BEGIN;
Session 1: SELECT * FROM sbtest1 WHERE id =1; //m_fast_path_state = 1048576, MDL ticket 不加MDL_lock::m_granted队列
Session 2: BEGIN;
Session 2: SELECT * FROM sbtest1 WHERE id =2; //m_fast_path_state=1048576+1048576=2097152,同上,走FAST PATH
Session 3: ALTER TABLE sbtest1 ENGINE = INNODB; //DDL请求加的MDL_SHARED_UPGRADABLE类型锁被视为unobtrusive lock,可以认为这个是比上述SQL的MDL锁级别更高的锁,并且不相容,因此被强制走slow path。而slow path是需要加MDL_lock::m_rwlock的写锁。m_fast_path_state = m_fast_path_state | MDL_lock::HAS_SLOW_PATH | MDL_lock::HAS_OBTRUSIVE
注:DDL还会获得库级别的意向排他MDL锁或者表级别的共享可升级锁,但为了表述方便,这里直接忽略了,只考虑涉及的同一个MDL_lock锁对象。
Session 4: SELECT * FROM sbtest1 WHERE id =3; // 检查m_fast_path_state &HAS_OBTRUSIVE,如果DDL还没跑完,就会走slow path。
从上面的描述可以看出,MDL子系统显式的对锁类型进行了区分(OBTRUSIVE or UNOBTRUSIVE),存储在数组矩阵m_unobtrusive_lock_increment。 因此对于相容类型的MDL锁类型,例如DML/SELECT,加锁操作几乎没有任何读写锁或MUTEX开销。对应WL#7304, WL#7306 , PATCH(Rev:7067,Rev:7129)(Rev:7586)
第三,由于引入了MDL锁,实际上早期版本用于控制Server和引擎层表级并发的THR_LOCK 对于Innodb而言已经有些冗余了,因此Innodb表完全可以忽略这部分的开销。
不过在已有的逻辑中,Innodb依然依赖THR_LOCK来实现LOCK TABLE tbname READ,因此增加了新的MDL锁类型来代替这种实现。实际上代码的大部分修改都是为了处理新的MDL类型,Innodb的改动只有几行代码。对应WL#6671,PATCH(Rev:8232)
第四,Server层的用户锁(通过GET_LOCK函数获取)使用MDL来重新实现。
用户可以通过GET_LOCK()来同时获取多个用户锁,同时由于使用MDL来实现,可以借助MDL子系统实现死锁的检测。注意由于该变化,导致用户锁的命名必须小于64字节,这是受MDL子系统的限制导致。对应WL#1159, PATCH(Rev:8356)

淘宝ID就是淘宝的账户名(账号名、会员名),是指成功注册淘宝时填写的会员或用户名;淘宝ID还可以称为淘宝会员名字、阿里旺旺名、淘宝账号登录名等。在跟卖家沟通的时候会显示淘宝会员名,就是淘宝id;在购物时能更方便查找到聊天记录,订单信息之类的,方便办理退货换货的售后服务。

淘宝封号能解封。其解封方法如下:1、申诉解封,通过淘宝的申诉渠道提交申诉请求。在申诉中,用户需要提供相关证据和解释,说明自己的行为符合淘宝的规定,并承诺遵守规定;2、联系客服,客服人员会根据实际情况进行审核和处理,并给予相应的建议和指导;3、整改行为,在解封申诉或联系客服时,用户可以说明自己已经认识到错误,并给出具体的整改方案和承诺。

淘宝七天无理由退货条件是商品必须是支持七天无理由退货、商品必须保持原样、商品必须是正品、消费者需要承担退运费和退款方式。详细介绍:1、商品必须是支持七天无理由退货,购买前,消费者需要仔细阅读商品详情页面上的退货政策说明,确认商品是否支持七天无理由退货;2、商品必须保持原样,商品必须保持原包装完好无损,并且没有使用过;3、商品必须是正品等等。

淘宝消息发不出去有感叹号可能是由于网络连接、账号设置、消息内容或系统问题引起的。其解决方法如下:1、网络连接问题,检查网络连接、关闭防火墙或代理;2、账号设置问题,检查账号状态跟设置;3、消息内容问题,确保消息内容符合淘宝平台的规定或者检查消息内容,避免使用敏感词汇;4、系统问题,更新版本过一段时间再发。

一个支付宝不可以绑定两个淘宝号。淘宝和支付宝是一对一的关系,支付宝账户和淘宝账户只能进行一对一的绑定,不能绑定多个,但是淘宝可以换绑支付宝;淘宝账户绑定了认证过的支付宝账户,则意味着其淘宝ID通过了支付宝认证。换绑方法:1、打开淘宝app,在“我的”页面点击右上角的“设置”图标;2、在设置页面点击“账号与安全”;3、选择“支付宝账号”;4、点击“更换支付宝绑定”即可。

区别:1、淘宝网是C2C网购平台,而京东是B2C平台。2、京东采用得是价值链整合模式,淘宝则采用的是开放平台模式。3、京东采用自买自卖的模式,赚取商品中间的差价,通过低收益来获取规模化的销量;淘宝则并不参与商品的实际销售和服务,商品的销售以及服务都是由淘宝卖家直接负责的。4、京东有自己的物流平台,采用的是分布式库存管理;淘宝依赖于第三方物流平台,采用的是集约式库存管理。

淘宝消息发不出去有感叹号的原因:1、群发大量广告垃圾信息或者营销信息;2、没有进行实人认证,需要尽快进行实名认证;3、当天对陌生人发送太多消息;4、发送内容涉及账号密码等信息;5、发送内容含有影响社会风气等。

淘宝售后服务在我的订单里面。详细介绍:1、宝客户端,:打开淘宝客户端,点击“我的淘宝”,然后选择“已买到的宝贝”,找到需要售后服务的订单,点击进入订单详情页面,可以在页面底部找到“退款/售后”入口,根据流程操作进行售后申请;2、网站,在电脑上登录淘宝官网,点击“已买到的宝贝”进入订单列表,找到需要售后服务的订单,点击订单号进入订单详情页面,可以在页面底部找到“退款/售后”入口。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

Dreamweaver CS6
Visual web development tools

Dreamweaver Mac version
Visual web development tools

Notepad++7.3.1
Easy-to-use and free code editor

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.