如果有一个WordPress插件更新自定义表中的行,但该更新遇到行锁定,会发生什么情况?E、 g.两个用户同时启动表1上的更新,一个设置年龄=1,另一个设置年龄=2:
是否会有行锁数据不是很重要,因为我不需要跟踪每一个变化。但我确实需要处理可能出现的任何错误。
如果有一个WordPress插件更新自定义表中的行,但该更新遇到行锁定,会发生什么情况?E、 g.两个用户同时启动表1上的更新,一个设置年龄=1,另一个设置年龄=2:
是否会有行锁数据不是很重要,因为我不需要跟踪每一个变化。但我确实需要处理可能出现的任何错误。
严格从MySQL的角度来看
如果50个DB连接尝试更新中的onw行mydb.mytable
1个表锁,1个更新,49个DB连接等待1个表锁,1个更新,48个DB连接等待1个表锁,1个更新,47个DB连接等待
MyISAM在流量巨大的WordPress网站上的可取之处在于,死锁永远不会发生。
如果基础表使用InnoDB Storage Engine, 行锁(即使在同一行上)永远不会阻止读取,但在写入期间仍然可能出现死锁。具有AUTOCOMMIT=0
设置为/etc/my。cnf中,每个DML语句(INSERT、UPDATE和DELETE)将作为单行事务执行。发出单独的行锁。因此,50 DB连接可以在50个不同的行之后进行,并且不会发生任何悲剧。
死锁从哪里来?
由于InnoDB表的主键包含在Clustered Index (internally known as the gen_clust_index), 行数据与索引项紧密耦合。针对不属于主键的列创建的任何索引都使用两个基本项进行编目,1)列值,2)gen\\u clust\\u索引键。有时,在InnoDB中更新索引列可能会导致我开玩笑地称之为索引便秘。当对彼此相邻存储的索引项生成两个或多个锁时,就会发生这种情况。这在一个流量很大的网站上是可能的。
我曾经帮助一位开发人员了解为什么会在DBA StackExchange中发生这种情况。该开发人员随后进行了代码更改。以下是这些帖子:
我正在使用Sidebar Generator 在我所有的主题中。该插件在“plugins”目录下正常工作,但我想以某种方式将其嵌入到我的主题中,因此它不会显示在已安装的插件列表中。我刚刚复制了sidebar\\u生成器。php(幸运的是,整个代码都在一个文件中)到mytheme/插件,并将其包含在函数中。phprequire_once (MY_PLUGINS . \'/sidebar_generator.php\'); 现在,它适用于所有其他插件,但不适用于这个插件!这样,当我点击“侧栏”时