数据库中Lock Wait Timeout 和 Deadlock 的区别

如果你使用ACID事务数据库,则可能听说过锁等待超时和死锁。这些是什么?它们又有什么不同?

我们许多人会在某个时候遇到这些现象。大多数数据库使用锁定策略来确保当多个用户(或连接或进程)同时读取和修改数据时数据保持一致。这些锁确保一次操作只能一次更改数据的特定部分,并序列化更改以进一步缓解这些竞争状况。没有这种锁定,可能会造成混乱和错误的行为。

锁定等待超时和死锁均由某些锁定机制引起。当一个用户获得某些数据的锁定并在另一用户尝试访问它时将其保留时,将导致锁定等待超时。如果第一个用户未解锁数据,第二个用户将在一段时间后超时。数据库将用错误消息响应第二个用户,该错误消息说他们的锁定等待时间太长。此行为使第二个用户永远不会等待,因此他们可以通过处理其他事情来保持工作效率。

死锁是一种相关行为,但是它们更为复杂。当多次锁定等待以任何用户都无法做任何进一步工作的方式发生时,就会发生死锁。例如,第一用户和第二用户都锁定一些数据。然后,他们各自尝试访问彼此的锁定数据。锁定过程有一个循环:用户A在等待B,而用户B在等待A。两者均无法继续。

一些数据库通过锁定等待超时解决死锁,但这确实很浪费。一方面,如果用户必须等待锁定请求超时,那么一切都会变得非常缓慢。 (MySQL的默认锁定等待超时为50秒。)更严重的是,这将导致许多长期存在的锁定,这增加了很多其他用户也尝试访问相同数据并自己陷入锁定的机会。等待或僵局。

因此,高性能数据库通常会进行锁定周期检测,以寻找锁链中的循环。当他们找到循环时,便知道需要中止其中一位用户的工作才能让其他人继续前进。被选为受害者的用户将收到一条错误消息,指出存在死锁。希望其他用户可以在他们的锁已被强制清除后继续进行工作。

避免因锁等待和死锁而造成浪费工作延迟的基本策略是相同的:

1.锁定尽可能少的数据。

2.锁定时间越短越好。

3.如果您要处理多个数据,请尝试以相同的顺序进行处理。 (周期仅在某些事物在一个方向上起作用而其他事物在相反的方向上起作用时才发生。)


大多数时候,您无需担心任何这些。数据库通常会为您处理所有这一切。通常,您无需明确要求锁定数据,并且通常无需考虑太多数据访问顺序。但是,如果确实遇到锁定等待超时或死锁,则可能需要使用EXPLAIN更深入地研究数据库执行计划的内部,检查架构和索引,甚至可能考虑数据的物理顺序以了解造成问题的原因。问题。

posted @ 2021-01-02 20:04  jean zhang  阅读(655)  评论(0编辑  收藏  举报