table和行锁的区别

Difference between table and row locks

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

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

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

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

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

MySQL docs shows this:

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

  • table 的大多数语句都是读取的。
  • table 的语句是读取和写入的混合,其中写入是对单个行的更新或删除,可以使用一个键读取:
  • SELECT 与并发 INSERT 语句相结合,很少有 UPDATE 或 DELETE 语句。
  • 整个 table 上的许多扫描或 GROUP BY 操作,没有任何编写器。

现在何时使用:臭名昭著的 "It depends" 适用于此: 问问自己这个交易的用例是什么?

通常在需要高粒度控制时使用行级锁定。在我看来,这应该用作默认值。说一个订单或订单详细信息 table,其中可以更新或删除订单。将整个 table 锁定在高交易量 table 上是没有意义的。我希望单个订单的用户能够更新每个订单,而不是在我知道他们的更改范围仅限于特定订单时将其他人拒之门外。

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