mysql - 表锁和行锁的区别

标签 mysql table-locking rowlocking

我正在研究 MySQL 及其工作原理,有些事情让我感到困惑,我在网上没有找到任何关于此的明确解释。

行锁和表锁到底有什么区别?一个锁定行,另一个锁定表。正确的?

那么,在什么情况下会使用表锁和行锁呢?它是程序员或数据库管理员可以编程的东西,还是引擎为您做的事情?

如果您认为有任何其他值得了解的信息,请随时将其添加到您的答案中。 我很抱歉这个可能很菜鸟的问题,但我仍在学习。

最佳答案

虽然这是 SQL Server,但它也适用于 mySQL:What are row, page and table locks? And when they are acquired?

MySQL docs shows this :

一般来说,在以下情况下表锁优于行级锁:

  • 该表的大多数语句都是读取。
  • 表的语句是读取和写入的混合,其中写入是对单行的更新或删除,可以通过一键读取来获取:
  • SELECT 与并发 INSERT 语句结合使用,很少有 UPDATE 或 DELETE 语句。
  • 在没有任何写入器的情况下对整个表进行多次扫描或 GROUP BY 操作。

现在何时使用:臭名昭著的“这取决于”适用于此: 问问自己这笔交易的用例是什么?

当需要高粒度控制时,通常会使用行级锁定。我认为这应该用作默认值。假设可以更新或删除订单的订单或订单详细信息表。在高事务量表上锁定整个表是没有意义的。我希望各个订单的用户能够更新每个订单,并且当我知道他们的更改范围仅限于特定订单时,不会将其他人锁定。

现在,如果我出于某种原因需要从备份中恢复订单和详细信息表;或根据外部来源对许多记录进行多次更新;我可以锁定整个表以确保所有更新成功完成,并且可以在让任何人返回之前验证负载。在进行所需的更新时,我不希望进行任何更改。但我们必须考虑锁全表是否会对用户体验产生负面影响;或者如果我们没有其他可用的选择。表级别的锁定将防止其他用户更改任何值。这真的是我们想要的吗?

关于mysql - 表锁和行锁的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448899/

相关文章:

mysql 交叉更新表

MySQL - 我可以避免这些相关/依赖子查询吗?

c# - (当用户输入数据时mySQL行锁c#

mysql - 是否可以让 MySQL 使用 1 DESC,2 ASC 的 ORDER 索引?

MySQL 根据日期范围生成每月分割

mysql - 大型 UPDATE [...] SELECT FROM 导致并行 UPDATE/DELETE 终止

postgresql - 在 plpgsql 函数中锁定表

MySQL 选择另一个表上的计数查询

sql - 关于SQL Server锁定机制

mysql - InnoDB 中行锁定所需的快速解释