MySQL出现“Lock wait timeout exceeded”错误的原因是什么?

1. 概述

在本教程中,我们将讨论MysqL中的“Lock wait timeout exceeded(锁等待超时)”错误。我们将讨论导致这个错误的原因以及MysqL锁的一些细微差别。

为了简单起见,我们将关注MysqL的InnoDB引擎,因为它是最受欢迎的引擎之一。但是,我们可以使用这里使用的相同测试来检查其他引擎的行为。

2. 在MysqL中的锁

lock一个特殊的对象,用于控制对资源的访问。在MysqL中,这些资源可以是表、行或内部数据结构。

一个需要习惯的概念是锁模式。锁模式S(共享)允许事务读取一行。多个事务可以同时获得某一行的锁。

X(排他)锁允许单个事务获取它。一个事务可以更新或删除行,而其他事务必须等待锁被释放,以便获取它。

MysqL 也有意向锁。 这些与表相关,并指示事务打算在表中的行上获取的锁类型。

锁定对于保证高并发环境中的一致性和可靠性至关重要。 但是,在优化性能时,必须进行一些权衡,在这些情况下,选择正确的隔离级别至关重要。

3. 隔离级别

MysqL InnoDB 提供4个事务 隔离级别。 它们在性能、一致性、可靠性和可重复性之间提供不同级别的平衡。 它们分别从最不严格到最严格:

  • READ UNCOMMITTED: 顾名思义,就是读未提交,也就是说事务所作的修改在未提交前,其他并发事务是可以读到的。

    存在"脏读"问题。

  • READ COMMITTED: 顾名思义,就是读已提交,一个事务只能看到其他并发的已提交事务所作的修改。很显然,该级别可以解决Read Uncommitted中出现的“脏读“问题。除了MysqL,很多数据库都以Read Committed作为认的事务隔离级别。

    存在"不可重复读"问题。虽然解决了“脏读”问题,但是Read Committed不能保证在一个事务中每次读都能读到相同的数据

  • REPEATABLE READ: 顾名思义,可重复读,也即在一个事务范围内相同的查询会返回相同的数据。

    存在"幻读"问题。也即在一次事务范围内多次进行查询,如果其他并发事务中途插入了新的记录,那么之后的查询会读取到这些“幻影”行。

  • SERIALIZABLE: 顾名思义,可串行化的,也即并发事务串行执行。很显然,该级别可以避免前面讲到的所有问题:“脏读”、“不可重复读”和“幻读”。

    代价是处理事务的吞吐量低,严重浪费数据库性能,因此要慎用此事务隔离级别。

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...