微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/wenti/3280568.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐