MySQL中lock与latch的区分

这里要区分锁中容易令人混淆的概念lock与latch。在数据库中,lock与latch都可以成为锁,但两者有截然不同的含义

latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时间长,则应用性能非常差,在InnoDB存储引擎中,latch有可以分为mutex(互斥锁)和rwlock(读写锁)其目的用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制

lock的对象是事务,用来锁定的是数据库中的UI想,如表、页、行。并且一般lock对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同),此外lock正如大多数数据库中一样,是有死锁机制的。表显示了lock与latch的不同

在InnoDB存储引擎中的latch,可以通过命令SHOW ENGINE INNODB MUTEX 来进行查看

mysql> SHOW ENGINE INNODB MUTEX;
+--------+-------------------+-------------+
| Type   | Name              | Status      |
+--------+-------------------+-------------+
| InnoDB | dict0dict.cc:1057 | os_waits=2  |
| InnoDB | log0log.cc:844    | os_waits=1  |
| InnoDB | fil0fil.cc:1690   | os_waits=1  |
| InnoDB | dict0dict.cc:1066 | os_waits=3  |
| InnoDB | log0log.cc:907    | os_waits=11 |
+--------+-------------------+-------------+
5 rows in set (4.14 sec)

在DEBUG版本下,通过SHOW ENGINE INNODB MUTEX 可以看到latch的更多信息

通过上述例子可以看到,type显示的总是InnoDB,列Name显示的是latch的信息及所在的源码位置(行数)。列Status比较复杂,在DEBUG模式下,除了显示os_waits,也会显示count、spin_waits、spin_rounds、 os_yields、os_wait_times等信息。

相对于latch来看,lock信息就显得直观了。可以通过SHOW ENGINE INNODB STATUS 及information_schema架构下的INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS来观察锁的信息 。

时间: 2024-10-08 02:30:48

MySQL中lock与latch的区分的相关文章

oracle中lock和latch的用途

本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大的区别. Oracle中锁的信息是数据块的一部分,是物理的,并不是逻辑上属于某个表或者某个行.Latch是Oracle提供的轻量级锁资源,他用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,他只工作在内存中, 我们可以不大准确的说,内存中资源的锁叫latch,数据库对象(表,索引

mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析。

一.Latch和Tlock的关系 Latch:为保护临界资源的正确性而设计,例如保护正在使用的内存页面不被破坏等. 没有死锁检测机制,轻量锁,并且作用对象时内存页面或是内存共享变量. Tlock:事务锁,作用对象是事务,有死锁检测机制. 在innodb内部,为了减少死锁的发生概率,Latch不会等待Tlock. 线程获取行锁的流程: 在对行加锁的时候会先对行所在的页面添加lath,然后再对行添加Tlock,待对行添加完Tlock后再释放页面的Lath. 这种机制主要是为了保证线程获取的行数据的一

MySQL中的latch(闩锁)详解——易产生的问题以及原因分析

Latch 什么是latch: 锁是数据库系统区别与文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb存储引擎在行级别上对表数据上锁,这固然不错.但是Innodb也会在多个地方使用锁,从而允许多种不同资源提供并发访问.例如,操作缓冲池汇总的LRU列表,删除.添加.移动LRU列表中的元素,为了保证一致性,必须有锁的介入,这就是latch锁. latch与lock的区别 latch一般称为闩锁(轻量级别的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差

mysql中,执行delete语句时出现Lock wait timeout exceeded问题

问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现错误.但过了一会再次执行delete,就能成功删除记录了. 原因分析: 由于commit语句没有执行到,即事务没有提交成功,表还是被锁着的.只能等锁超时了,才能再次执行delete等操作. 解决办法: 1.遇到问题后可以kill掉对应的线程再次执行delete等操作. 2.为避免问题出现,可以开启mysql中的auto

MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file记录日志的文件名. 4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. 二

mysql中的索引、触发器、和事务

一.索引 1.什么是索引 如果把表看做一本书,索引就好像书里的目录或者书签,能帮助你快速找到你要检索的内容,所以叫做索引. 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如 果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合 要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已 经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个 记录,通过索引查找记录至少要比

[数据库事务与锁]详解六: MySQL中的共享锁与排他锁

注明: 本文转载自http://www.hollischuang.com/archives/923 在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使用方式及注意事项等. 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁.其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁. 如果事务T对数

如何在MySQL中获得更好的全文搜索结果

很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候. mysql针对这一问题提供了一种基于内建的全文查找方式的解决方案.在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜

在mysql 中两种锁定问题

mysql 中15.2.10.5 中描述了两个问题,且分别给出了解决办法.1.向子表中写入数据,但写入之前需确保父表中存在其相应信息.可能出现,在已经读取父表中的数据,但另一请求将其删除.办法: begin; select info from father_table where name = 'nike' LOCK IN SHARE MODE; insert into son_table values('SomeInfo'); commit; 事务是确保多个进程的原子性, 但不能保证上述问题的