我正在研究mysql及其工作原理,有些东西让我困惑,我在网上找不到任何关于这个的明确解释。行锁和表锁之间到底有什么区别?一个锁定行,另一个锁定表。对的?那么,在哪种情况下您会使用表锁和行锁呢?它是程序员或数据库管理员可以编程的东西,还是由enigne为您编写的?如果有任何其他信息你认为是好知道,请随时添加到您的答案。我很抱歉这个可能是愚蠢的问题,但我还在学习。
vjrehmav1#
虽然这是sql server,但它也适用于mysql:什么是行锁、页锁和表锁?当它们被获得时呢?。mysql文档显示:通常,表锁在以下情况下优于行级锁:表的大多数语句都是reads。表的语句是读和写的混合,其中写是可以用一个键读取的单个行的更新或删除:select与并发insert语句结合使用,很少使用update或delete语句。在没有任何写入程序的情况下,对整个表进行多次扫描或按操作分组。现在什么时候使用:臭名昭著的“it dependens”适用于这里:问问自己这个事务的用例是什么?通常,当需要高粒度控制时,将使用行级锁定。在我看来,这应该被用作默认值。比如一个订单或订单明细表,可以在其中更新或删除订单。在高事务量表上锁定整个表是没有意义的。我希望个别订单的用户能够更新每个订单,而不是锁定别人,当我知道他们的变化范围是一个特定的订单有限。现在如果出于某种原因需要从备份中恢复orders和details表;或根据外部来源对多个记录进行多次更新;我可能会锁定整个表,以确保所有的更新成功完成,我可以验证负载之前,我让任何人回来。在进行所需更新时,我不需要任何更改。但是我们必须考虑锁定整个表是否会对用户体验产生负面影响;或者如果我们没有其他选择。表级别的锁定将阻止其他用户更改任何值。这真的是我们想要的吗?
1条答案
按热度按时间vjrehmav1#
虽然这是sql server,但它也适用于mysql:什么是行锁、页锁和表锁?当它们被获得时呢?。
mysql文档显示:
通常,表锁在以下情况下优于行级锁:
表的大多数语句都是reads。
表的语句是读和写的混合,其中写是可以用一个键读取的单个行的更新或删除:
select与并发insert语句结合使用,很少使用update或delete语句。
在没有任何写入程序的情况下,对整个表进行多次扫描或按操作分组。
现在什么时候使用:臭名昭著的“it dependens”适用于这里:问问自己这个事务的用例是什么?
通常,当需要高粒度控制时,将使用行级锁定。在我看来,这应该被用作默认值。比如一个订单或订单明细表,可以在其中更新或删除订单。在高事务量表上锁定整个表是没有意义的。我希望个别订单的用户能够更新每个订单,而不是锁定别人,当我知道他们的变化范围是一个特定的订单有限。
现在如果出于某种原因需要从备份中恢复orders和details表;或根据外部来源对多个记录进行多次更新;我可能会锁定整个表,以确保所有的更新成功完成,我可以验证负载之前,我让任何人回来。在进行所需更新时,我不需要任何更改。但是我们必须考虑锁定整个表是否会对用户体验产生负面影响;或者如果我们没有其他选择。表级别的锁定将阻止其他用户更改任何值。这真的是我们想要的吗?