我正在研究 MySQL 及其工作原理,有些事情让我感到困惑,我在网上没有找到任何关于此的明确解释。
行锁和表锁到底有什么区别?一个锁定行,另一个锁定表。正确的?
那么,在什么情况下会使用表锁和行锁呢?它是程序员或数据库管理员可以编程的东西,还是引擎为您做的事情?
如果您认为有任何其他值得了解的信息,请随时将其添加到您的答案中。 我很抱歉这个可能很菜鸟的问题,但我仍在学习。
最佳答案
虽然这是 SQL Server,但它也适用于 mySQL:What are row, page and table locks? And when they are acquired? 。
一般来说,在以下情况下表锁优于行级锁:
- 该表的大多数语句都是读取。
- 表的语句是读取和写入的混合,其中写入是对单行的更新或删除,可以通过一键读取来获取:
- SELECT 与并发 INSERT 语句结合使用,很少有 UPDATE 或 DELETE 语句。
- 在没有任何写入器的情况下对整个表进行多次扫描或 GROUP BY 操作。
现在何时使用:臭名昭著的“这取决于”适用于此: 问问自己这笔交易的用例是什么?
当需要高粒度控制时,通常会使用行级锁定。我认为这应该用作默认值。假设可以更新或删除订单的订单或订单详细信息表。在高事务量表上锁定整个表是没有意义的。我希望各个订单的用户能够更新每个订单,并且当我知道他们的更改范围仅限于特定订单时,不会将其他人锁定。
现在,如果我出于某种原因需要从备份中恢复订单和详细信息表;或根据外部来源对许多记录进行多次更新;我可以锁定整个表以确保所有更新成功完成,并且可以在让任何人返回之前验证负载。在进行所需的更新时,我不希望进行任何更改。但我们必须考虑锁全表是否会对用户体验产生负面影响;或者如果我们没有其他可用的选择。表级别的锁定将防止其他用户更改任何值。这真的是我们想要的吗?
关于mysql - 表锁和行锁的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448899/