如果同时请求,Sql Update语句是否同时运行?

Rya*_*yan 5 mysql sql sql-update

如果两个独立的脚本调用具有对同一字段的更新请求但具有不同值的数据库,它们是否会同时执行而另一个会覆盖另一个?

作为一个例子来帮助确保清晰度,想象这两个语句被要求同时运行,每个语句由不同的脚本运行,其中Status = 2在Status = 1之后被称为微秒,巧合.

Update My_Table SET Status = 1 WHERE Status= 0;
Update My_Table SET Status = 2 WHERE Status= 0;
Run Code Online (Sandbox Code Playgroud)

我的结果是什么?为什么?如果其他因素起作用,请尽可能多地扩展它们,这是一个普遍的想法.

旁注:因为我知道人们仍然会问,我的情况是将MySql与Google App Engine一起使用,但我不想将此问题仅限于我,如果对其他人有用的话.我使用Status作为脚本正在为该字段做什么的标识符.如果status不为0,则不允许其他脚本触摸它.

Par*_*ney 2

这就是锁定的用途。默认情况下,所有主要 SQL 实现都会锁定 DML 语句,以便一个查询在第一个查询完成之前不会覆盖另一个查询。

有不同级别的锁定。如果您有行锁定,那么您的第二个更新将与第一个更新并行运行,因此在某些时候您的表中将有 1 和 2。

表锁定将强制第二个查询等待第一个查询完全完成以释放其表锁。

您通常可以在 SQL 中直接关闭锁定,但只有当您需要性能提升并且知道不会遇到像示例中那样的竞争条件时,才可以这样做。

根据新MySQL标签进行编辑

如果您正在更新使用该引擎的表InnoDB,那么您正在使用行锁定,并且您的查询可能会生成同时包含 1 和 2 的表。

如果您正在使用使用该MyISAM引擎的表,那么您正在使用表锁定,并且您的更新语句最终会得到一个全为 1 或全为 2 的表。