MySQL8.0新特性: 新的事务锁调度VATS简介

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 传统的事务锁赋予方式是采用FIFS先来先服务的方式,从MySQL8.0.3开始,引入了一种新的模式CATS调度方式,全称为Contention-Aware Transaction Scheduling (或者叫做VATS, V=Variance). 顾名思义就是能够感知到事务竞争关系来实现全局最小开销的锁调度方式。

传统的事务锁赋予方式是采用FIFS先来先服务的方式,从MySQL8.0.3开始,引入了一种新的模式CATS调度方式,全称为Contention-Aware Transaction Scheduling (或者叫做VATS, V=Variance). 顾名思义就是能够感知到事务竞争关系来实现全局最小开销的锁调度方式。

举个简单的例子,trx1和trx2同时等待一条记录锁,按照传统的方式,谁先进入等待队列,谁将优先获得锁。但如果同时有2个事务等待trx1,10个事务等待trx2,那么从全局来看收益最大的显然是让trx2获取到行锁。

当被挂起等待的事务数超过32个时,会自动切换到新的调度方式

论文一:
A Top-Down Approach to Achieving Performance Predictability in Database Systems

论文二:
Contention-Aware Lock Scheduling for Transactional Databases

论文三:
Identifying the Major Sources of Variance in Transaction Latencies: Towards More Predictable Databases

Release Note

InnoDB now uses Variance-Aware Transaction Scheduling (VATS) for scheduling the release of transaction locks when the system is highly loaded, which helps reduce lock sys wait mutex contention. Lock scheduling uses VATS when >= 32 threads are suspended in the lock wait queue.

For more information about Variance-Aware Transaction Scheduling (VATS), see Identifying the Major Sources of Variance in Transaction Latencies: Towards More Predictable Databases.

WL#10793: InnoDB: Use CATS for scheduling lock release under high load

主要代码变更见这个commit: fb056f442a96114c74d291302e8c4406c8c8e1af, 或者commit log搜WL#10793关键字

这个功能的核心有两个,一个是如何去维护每个事务的权重,在代码里以trx_t::age表示,第二个是基于新的调度算法,如何去选择被调度的事务。

PS: 本文是本人在看代码过程中的粗略记录,不保证全面性
PS2: 本文涉及函数基于MySQL8.0.3

何时使用VATS算法

是否使用新调度算法,需要满足如下条件(lock_use_fcfs()):

  • 当前线程不是复制线程
  • 并发等待线程数超过32(LOCK_VATS_THRESHOLD)

关于第二点,增加了lock_sys_t::n_waiting来追踪,在函数lock_wait_suspend_thread里递增,在lock_wait_table_release_slot里递减

事务权重维护

事务age的接口函数为lock_update_agelock_update_trx_age,在将新的事务所加入hash,或者完成一次grant操作后,都需要对事务age进行更新

先来看看函数lock_update_age是如何计算的:

  • 如果当前新建的锁对象不能立刻赋予,需要等待其他锁对象时,对于已经拿到这个记录上锁的事务进行age累加,值为当前锁对象事务的trx_t::age + 1,那些等待当前新锁的事务都需要去依次更新其age;
    如果当前事务无需等待,则找到那些在等待该记录锁的事务,并累加这些事务的trx_t::age+1 到当前事务

  • 针对每个事务的age更新,是一个递归函数,函数接口为lock_update_trx_age

    • a)将新的age值赋予给trx_t
    • b)如果当前事务也处于等待状态的话,则找到其等待的锁被哪些事务持有,并将age值累加上去。
  • 通过如上的递归流程,确保了在等待向量图中每个事务的权重被正确的更新掉

Grant Lock

当释放掉一个锁时,需要检查是否有别的等待的锁可以获得锁,VATS调度的函数入口为lock_rec_dequeue_from_page --> lock_grant_vats

相比传统的grant方式,lock_grant_vats函数的逻辑要复杂许多:

  • 将当前锁对象移除后,剩下的在同一条记录上的锁被分为两个队列:
    • waiting队列中存储需要等待的锁对象
    • granted队列存储已经获的锁对象

waiting队列会做一个排序,排序规则从comment里拷贝的,如下:

1. If neither of them is a wait lock, the LHS one has higher priority.
2. If only one of them is a wait lock, it has lower priority.
3. If both are high priority transactions, the one with a lower seq
     number has higher priority.
4. High priority transaction has higher priority.
5. Otherwise, the one with an older transaction has higher priority.

简单来说,如果不考虑事务优先级,队列时按照trx_t::age进行排序。

  • 然后依次遍历waiting队列,如果无需等待(lock_rec_has_to_wait_vats), 则赋予记录锁,并将其移到哈希队列的头部

  • 无论是当前释放的锁移除出锁队列,还是任一等待的事务获得了锁,都需要去更新锁等待图相关联事务权重

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
2月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
1月前
|
SQL 监控 关系型数据库
MySQL事务处理:ACID特性与实战应用
本文深入解析了MySQL事务处理机制及ACID特性,通过银行转账、批量操作等实际案例展示了事务的应用技巧,并提供了性能优化方案。内容涵盖事务操作、一致性保障、并发控制、持久性机制、分布式事务及最佳实践,助力开发者构建高可靠数据库系统。
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
25天前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
64 15
|
5月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
115 0
|
19天前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
|
3月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
151 1
|
5月前
|
存储 SQL 关系型数据库
MySQL存储引擎简介
在选择相应的存储引擎时,需要充分考虑实际业务场景、性能需求和数据一致性要求,从而为数据管理提供最佳支持。
309 17
|
10月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
4247 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多