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

时间:2015-08-11 16:57:49

标签: 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;

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

您通常可以在SQL中关闭锁定,但只有在您需要提升性能并且您知道不会遇到示例中的竞争条件时才会执行此操作。

根据新的MySQL代码

进行修改

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

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

答案 1 :(得分:2)

来自https://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html(MySql)

  

通常,您不需要锁定表,因为所有单个UPDATE语句都是原子的;没有其他会话可以干扰任何其他当前正在执行的SQL语句。但是,在某些情况下,锁定表可能会带来优势:

来自https://msdn.microsoft.com/en-us/library/ms177523.aspx(sql server)

  

UPDATE语句始终在其修改的表上获取独占(X)锁,并保持该锁,直到事务完成。使用独占锁定,没有其他事务可以修改数据。

如果您有两个单独的连接执行两个已发布的更新语句,那么首先启动的语句将是完成的语句。其他声明不会更新数据,因为不再有状态为0

的记录

答案 2 :(得分:1)

简短的回答是:它取决于首先提交的语句。仅仅因为一个流程在另一个流程之前启动了update语句并不意味着它将在另一个流程之前完成。它可能不会先安排,可能会被其他进程阻止等等。

最终,它是一个竞争条件:完成(并提交)最后一次的操作获胜。

答案 3 :(得分:1)

由于您有两个脚本执行相同的操作并使用不同的UPDATE值,因此它们不会同时运行,即使您认为同时调用它们,其中一个脚本也会运行。你需要指定WHEN每个脚本应该运行,否则程序将不知道应该是什么1和应该是什么2.