如果同时请求,是否同时 Sql 更新语句 运行?
Do Sql Update Statements run at the same time if requested at the same time?
如果两个独立的脚本调用同一个字段更新请求的数据库,但具有不同的值,它们会同时执行并且一个覆盖另一个吗?
作为帮助确保清晰的示例,假设同时向 运行 请求这两个语句,每个语句由不同的脚本请求,其中 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,则不允许其他脚本访问它。
这就是锁定的目的。默认情况下,所有主要 SQL 实现都会锁定 DML 语句,以便一个查询不会在第一个查询完成之前覆盖另一个查询。
有不同级别的锁定。如果你有行锁定,那么你的第二次更新将与第一次更新 运行 并行,所以在某些时候你的 table.
中会有 1s 和 2s
Table 锁定将强制第二个查询等待第一个查询完全完成以释放它的 table 锁。
您通常可以在您的 SQL 中关闭锁定,但只有在您需要提高性能并且您知道您不会像您的示例那样遇到竞争条件时才会这样做。
根据新的 MySQL
标签进行编辑
如果您正在更新使用 InnoDB
引擎的 table,那么您正在使用行锁定,并且您的查询可能会产生一个包含 1 和2秒。
如果您正在使用使用 MyISAM
引擎的 table,那么您正在使用 table 锁定,并且您的更新语句将以 table 要么全为 1,要么全为 2。
来自 https://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html (MySql)
Normally, you do not need to lock tables, because all single UPDATE statements are atomic; no other session can interfere with any other currently executing SQL statement. However, there are a few cases when locking tables may provide an advantage:
来自 https://msdn.microsoft.com/en-us/library/ms177523.aspx(sql 服务器)
An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. With an exclusive lock, no other transactions can modify data.
如果您有两个单独的连接执行两个已发布的更新语句,则先启动的语句将是完成的语句。另一个语句不会更新数据,因为不再有状态为 0
的记录
简短的回答是:这取决于哪个语句先提交。仅仅因为一个进程在另一个进程之前启动了一个 update
语句并不意味着它会在另一个进程之前 complete 。它可能不会首先被调度,它可能被另一个进程阻塞,等等。
最终,这是一个竞争条件:最后完成(并提交)的操作获胜。
由于您有两个脚本执行相同的操作并为更新使用不同的值,因此它们不会同时 运行,即使您认为其中一个脚本会 运行你在同时给他们打电话。您需要指定 WHEN 每个脚本应该 运行,否则程序将不知道什么应该是 1 什么应该是 2。
如果两个独立的脚本调用同一个字段更新请求的数据库,但具有不同的值,它们会同时执行并且一个覆盖另一个吗?
作为帮助确保清晰的示例,假设同时向 运行 请求这两个语句,每个语句由不同的脚本请求,其中 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,则不允许其他脚本访问它。
这就是锁定的目的。默认情况下,所有主要 SQL 实现都会锁定 DML 语句,以便一个查询不会在第一个查询完成之前覆盖另一个查询。
有不同级别的锁定。如果你有行锁定,那么你的第二次更新将与第一次更新 运行 并行,所以在某些时候你的 table.
中会有 1s 和 2sTable 锁定将强制第二个查询等待第一个查询完全完成以释放它的 table 锁。
您通常可以在您的 SQL 中关闭锁定,但只有在您需要提高性能并且您知道您不会像您的示例那样遇到竞争条件时才会这样做。
根据新的 MySQL
标签进行编辑
如果您正在更新使用 InnoDB
引擎的 table,那么您正在使用行锁定,并且您的查询可能会产生一个包含 1 和2秒。
如果您正在使用使用 MyISAM
引擎的 table,那么您正在使用 table 锁定,并且您的更新语句将以 table 要么全为 1,要么全为 2。
来自 https://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html (MySql)
Normally, you do not need to lock tables, because all single UPDATE statements are atomic; no other session can interfere with any other currently executing SQL statement. However, there are a few cases when locking tables may provide an advantage:
来自 https://msdn.microsoft.com/en-us/library/ms177523.aspx(sql 服务器)
An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. With an exclusive lock, no other transactions can modify data.
如果您有两个单独的连接执行两个已发布的更新语句,则先启动的语句将是完成的语句。另一个语句不会更新数据,因为不再有状态为 0
的记录简短的回答是:这取决于哪个语句先提交。仅仅因为一个进程在另一个进程之前启动了一个 update
语句并不意味着它会在另一个进程之前 complete 。它可能不会首先被调度,它可能被另一个进程阻塞,等等。
最终,这是一个竞争条件:最后完成(并提交)的操作获胜。
由于您有两个脚本执行相同的操作并为更新使用不同的值,因此它们不会同时 运行,即使您认为其中一个脚本会 运行你在同时给他们打电话。您需要指定 WHEN 每个脚本应该 运行,否则程序将不知道什么应该是 1 什么应该是 2。