`
丁林.tb
  • 浏览: 797260 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[MySQL Q&A] 关于 table_lock_wait 和 table_lock_immediate

阅读更多

前记      

前几天收到一位同行的一个文档,是MySQL High Performance 2的读书笔记, 97页,6w多字。在描述完知识点后,有疑问的地方列出问题,希望和我讨论。看完以后非常敬佩,自感自己无法做到这么细心。为表敬意,承诺会一一回答里面的问题。对于无法简单回复的问题,就想通过博客的方式写出来,便于讨论。

因此这个系列,就是回复这位同学的文档中的问题的。

 

问题

服务器变量table_locks_immediatetable_locks_waited#?它们保持多大的比例是合适的?

背景

    table_locks_immediate表示可以立即获取锁的查询次数, table_locks_waited表示不能立即获取锁的次数;

Session 1

Session 2

lock tables t1 read;

(table_locks_immediate1)

 

 

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_immediate1)

 

 

update t1 set y=1 where id=1;

lockedtable_locks_waited不变)

这个例子看上去像个bugsession 1锁表,session 2试图更新这个表,被锁住了,但是table_locks_waited没有加1,而且查看table_locks_immediate也不变。

其原因是5.5新引入的metadata lockMDL),对表的访问都需要获取MDL。在这个例子中,session 1拥有一个排他MDL,因此Session2是被锁在获取MDL的阶段。

由于MDL是在获取表锁之前,因此在session 2lock的时,上述两个变量都不变。

 

什么情况下会触发table_locks_waited

  从上面这个例子看,引入MDL以后,table_locks_waited并不容易触发。除非应用主动作lock tables t read

  我们用并发压力,两个线程分别执行update t1 set y=y+1 where id=1;5000次。

 t1MyISAM表,MyISAM是表锁,在并发压力下,是会导致table_locks_waited急剧增加。

  而在InnoDB表,由于是行锁,因此获取表锁这个逻辑都能顺利通过,因此table_locks_waited不变。

 

table_locks_waited多少合适

  回到初始的问题,若库中都是InnoDB的表,在5.5以后,table_locks_waited这个值应该很小。在mysqldump导出表时,会执行lock table,可能导致此值增加。其他情况下,若这个值有变,说明应用端主动作了lock table,这个在InnoDB表上是不需要的,需要应用修改。

2
1
分享到:
评论
1 楼 lidayu_up 2013-04-11  
我在5.5.1下,实验发现你的“异像”没有出现,两个参数都增加了,我用的是
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.0.6            |
+------------------+


另外请问,mdl这个实现是在表的数句字典上实现的吗?


相关推荐

    轻松玩转MySQL之锁篇

    MySQL的锁主要分为乐观锁和悲观锁,乐观锁一般是程序自己实现,可以根据版本号或者时间戳字段实现 MySQL表级锁 表级锁由MySQL Layer层实现 MySQL 实现的表级锁定的争用状态变量 show status like 'table%'; table...

    MySQL status解读.zip_MYSQL

    14. **Table_locks_immediate** 和 **Table_locks_waited**:立即获取和等待表锁的次数,等待次数过多可能表明存在锁竞争问题。 15. **Qcache_free_memory** 和 **Qcache_not_cached**:查询缓存的空闲内存和未缓存...

    mysql锁分析(csdn)————程序.pdf

    可以通过 table_locks_immediate 和 table_lock_waited 状态变量来分析系统上的表锁定。table_locks_immediate 表示可以立即获取的查询次数,每立即获取锁次数加 1。table_lock_waited 表示出现表级锁定争用而发生...

    createtable.rar_oracle

    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`错误,...

    MySQL高级 锁机制

    locks%'`,我们可以获取关于表级锁定的统计信息,如`table_locks_immediate`表示立即获得表锁的次数,`table_locks_waited`则显示因锁定争用而发生的等待次数,这些指标有助于分析和优化锁的使用。 接着,我们转向...

    浅析MYSQL中的并发操作与锁定

    MYSQL中的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会...

    mysql锁表1

    MySQL通过检测和回滚其中一个事务来解决死锁问题,这通常由`innodb_lock_wait_timeout`系统变量定义的超时时间触发。 在优化锁性能方面,应尽量减少锁定时间,使用短事务,并避免不必要的表级锁定。另外,考虑使用...

    mysql巡检报告.pdf

    * 结果解释:检查结果正常,Table_locks_immediate 20,Table_locks_waited 0,所有指标都在正常范围内。 DBMy07: 检查 MySQL 数据库键效率 * 检查点:检查 MySQL 数据库键效率,包括键命中和使用的键缓冲 * 检查...

    MYSQL锁机制

    MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。 - **表共享读锁**:允许其他用户读取同一表的数据,但不允许写入。 - **表独占写锁**:阻止任何用户对同一表进行读写...

    MySQL锁详解

    例如,使用show status like "table%"命令可以查看Table_locks_immediate和Table_locks_waited的值,这两个变量分别表示立即获取锁的次数和等待获取锁的次数。如果Table_locks_waited值较高,则表明存在严重的表级锁...

    Oracle中EXECUTE IMMEDIATE用法

    通过`EXECUTE IMMEDIATE`,开发者可以在不知道确切SQL语句的情况下动态构建并执行SQL查询、数据操纵语言(DML)和数据定义语言(DDL)语句。 ### 使用场景与限制 1. **动态DML执行**:`EXECUTE IMMEDIATE`可以用于...

    mysql常用性能查询语句

    使用语句:show status like 'table_locks_immediate'; 该语句可以查看立即获得的表的锁的次数。 13. 查看不能立即获得的表的锁的次数 使用语句:show status like 'table_locks_waited'; 该语句可以查看不能...

    oracle 常用命令脚本大全

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和灵活性使得它在企业级应用中占据了重要地位。本文将详细介绍Oracle的一些常用命令脚本,帮助你更好地管理和操作Oracle数据库。 1. 数据库...

    批量创建表

    存储过程首先遍历字典表,获取每个表的列名、数据类型和是否可为空的信息,然后动态生成并执行DROP TABLE(删除表)和CREATE TABLE(创建表)语句。如果需要处理外键约束,还需额外处理DBA_CONS_COLUMNS等视图。 在...

    oracle动态sql之EXECUTE IMMEDIATE.docx

    Oracle 动态 SQL 之 EXECUTE IMMEDIATE Oracle 动态 SQL 中的 EXECUTE IMMEDIATE 语句是数据库中执行动态 SQL 语句或非运行时创建的 PL/SQL 块的重要工具。与 DBMS_SQL package 相比,EXECUTE IMMEDIATE 使用较...

    Oraclr存储过程建表建约束

    在Oracle数据库系统中,存储过程是一种预编译的SQL和PL/SQL代码集合,它可以用于执行复杂的数据库操作,如创建表、添加约束、插入数据等。这个“Oraclr存储过程建表建约束”示例提供了如何利用存储过程来完成这些...

    微软内部资料-SQL性能优化3

    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 ...

    mysql日常维护

    - 当`Table_locks_waited`与`Table_locks_immediate`的比率较高时,表明存在较多的表锁竞争。此时需要进一步分析查询语句,考虑是否可以通过优化索引、改变存储引擎等方式来减少锁的竞争。 - `Innodb_row_lock_...

Global site tag (gtag.js) - Google Analytics