前记
前几天收到一位同行的一个文档,是MySQL High Performance 2的读书笔记, 97页,6w多字。在描述完知识点后,有疑问的地方列出问题,希望和我讨论。看完以后非常敬佩,自感自己无法做到这么细心。为表敬意,承诺会一一回答里面的问题。对于无法简单回复的问题,就想通过博客的方式写出来,便于讨论。
因此这个系列,就是回复这位同学的文档中的问题的。
问题
服务器变量table_locks_immediate和 table_locks_waited#?它们保持多大的比例是合适的?
背景
table_locks_immediate表示可以立即获取锁的查询次数, table_locks_waited表示不能立即获取锁的次数;
Session 1 |
Session 2 |
lock tables t1 read; (table_locks_immediate+1) |
|
|
update t1 set y=1 where id=1; (locked并且table_locks_waited+1) |
上面这个例子很简单,session 1加了表所,但是session 2要更新,获取表锁失败。
异象
Session 1 |
Session 2 |
lock tables t1 write; (table_locks_immediate+1) |
|
|
update t1 set y=1 where id=1; (locked但table_locks_waited不变) |
这个例子看上去像个bug,session 1锁表,session 2试图更新这个表,被锁住了,但是table_locks_waited没有加1,而且查看table_locks_immediate也不变。
其原因是5.5新引入的metadata lock(MDL),对表的访问都需要获取MDL。在这个例子中,session 1拥有一个排他MDL,因此Session2是被锁在获取MDL的阶段。
由于MDL是在获取表锁之前,因此在session 2被lock的时,上述两个变量都不变。
什么情况下会触发table_locks_waited
从上面这个例子看,引入MDL以后,table_locks_waited并不容易触发。除非应用主动作lock tables t read。
我们用并发压力,两个线程分别执行update t1 set y=y+1 where id=1;各5000次。
若t1为MyISAM表,MyISAM是表锁,在并发压力下,是会导致table_locks_waited急剧增加。
而在InnoDB表,由于是行锁,因此获取表锁这个逻辑都能顺利通过,因此table_locks_waited不变。
table_locks_waited多少合适
回到初始的问题,若库中都是InnoDB的表,在5.5以后,table_locks_waited这个值应该很小。在mysqldump导出表时,会执行lock table,可能导致此值增加。其他情况下,若这个值有变,说明应用端主动作了lock table,这个在InnoDB表上是不需要的,需要应用修改。
相关推荐
MySQL的锁主要分为乐观锁和悲观锁,乐观锁一般是程序自己实现,可以根据版本号或者时间戳字段实现 MySQL表级锁 表级锁由MySQL Layer层实现 MySQL 实现的表级锁定的争用状态变量 show status like 'table%'; table...
14. **Table_locks_immediate** 和 **Table_locks_waited**:立即获取和等待表锁的次数,等待次数过多可能表明存在锁竞争问题。 15. **Qcache_free_memory** 和 **Qcache_not_cached**:查询缓存的空闲内存和未缓存...
可以通过 table_locks_immediate 和 table_lock_waited 状态变量来分析系统上的表锁定。table_locks_immediate 表示可以立即获取的查询次数,每立即获取锁次数加 1。table_lock_waited 表示出现表级锁定争用而发生...
EXECUTE IMMEDIATE 'CREATE TABLE my_table (id INT PRIMARY KEY)'; EXCEPTION WHEN table_exists THEN DBMS_OUTPUT.PUT_LINE('Table already exists.'); END; / ``` 这里的异常处理部分捕获了`ORA-00955`错误,...
locks%'`,我们可以获取关于表级锁定的统计信息,如`table_locks_immediate`表示立即获得表锁的次数,`table_locks_waited`则显示因锁定争用而发生的等待次数,这些指标有助于分析和优化锁的使用。 接着,我们转向...
MYSQL中的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会...
MySQL通过检测和回滚其中一个事务来解决死锁问题,这通常由`innodb_lock_wait_timeout`系统变量定义的超时时间触发。 在优化锁性能方面,应尽量减少锁定时间,使用短事务,并避免不必要的表级锁定。另外,考虑使用...
* 结果解释:检查结果正常,Table_locks_immediate 20,Table_locks_waited 0,所有指标都在正常范围内。 DBMy07: 检查 MySQL 数据库键效率 * 检查点:检查 MySQL 数据库键效率,包括键命中和使用的键缓冲 * 检查...
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。 - **表共享读锁**:允许其他用户读取同一表的数据,但不允许写入。 - **表独占写锁**:阻止任何用户对同一表进行读写...
例如,使用show status like "table%"命令可以查看Table_locks_immediate和Table_locks_waited的值,这两个变量分别表示立即获取锁的次数和等待获取锁的次数。如果Table_locks_waited值较高,则表明存在严重的表级锁...
通过`EXECUTE IMMEDIATE`,开发者可以在不知道确切SQL语句的情况下动态构建并执行SQL查询、数据操纵语言(DML)和数据定义语言(DDL)语句。 ### 使用场景与限制 1. **动态DML执行**:`EXECUTE IMMEDIATE`可以用于...
使用语句:show status like 'table_locks_immediate'; 该语句可以查看立即获得的表的锁的次数。 13. 查看不能立即获得的表的锁的次数 使用语句:show status like 'table_locks_waited'; 该语句可以查看不能...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和灵活性使得它在企业级应用中占据了重要地位。本文将详细介绍Oracle的一些常用命令脚本,帮助你更好地管理和操作Oracle数据库。 1. 数据库...
存储过程首先遍历字典表,获取每个表的列名、数据类型和是否可为空的信息,然后动态生成并执行DROP TABLE(删除表)和CREATE TABLE(创建表)语句。如果需要处理外键约束,还需额外处理DBA_CONS_COLUMNS等视图。 在...
Oracle 动态 SQL 之 EXECUTE IMMEDIATE Oracle 动态 SQL 中的 EXECUTE IMMEDIATE 语句是数据库中执行动态 SQL 语句或非运行时创建的 PL/SQL 块的重要工具。与 DBMS_SQL package 相比,EXECUTE IMMEDIATE 使用较...
在Oracle数据库系统中,存储过程是一种预编译的SQL和PL/SQL代码集合,它可以用于执行复杂的数据库操作,如创建表、添加约束、插入数据等。这个“Oraclr存储过程建表建约束”示例提供了如何利用存储过程来完成这些...
Another type of table lock is a schema stability lock (Sch-S) and is compatible with all table locks except the schema modification lock (Sch-M). The schema modification lock (Sch-M) is incompatible ...
- 当`Table_locks_waited`与`Table_locks_immediate`的比率较高时,表明存在较多的表锁竞争。此时需要进一步分析查询语句,考虑是否可以通过优化索引、改变存储引擎等方式来减少锁的竞争。 - `Innodb_row_lock_...