选择受更新影响的行

Wil*_*ill 6 mysql sql atomic

如何UPDATE在MySQL中获取受SQL 语句影响的确切行?

我在许多计算机上有许多客户端可以随时根据WHERE子句更新同一个表中的行,并且每个客户端需要在另一个系统中为它们影响的每一行执行某些操作,因此获取受影响项的列表必须准确并且不容易受到竞争条件的影响.

一些数据库支持UPDATE ... OUTPUT UPDATED.id WHERE ...例如SQL Server.

你怎么能在MySQL中做这个原子UPDATE/ SELECT

(我已经看到了做第SELECT一个然后使用ID作为一个IN子句的建议UPDATE.但是另一个客户端可能运行相同SELECT并检索相同的行,而第一个客户端排队UPDATE等等?)

Nak*_*lda 2

使用表锁定或事务(如果存储引擎支持)来防止竞争条件。

LOCK TABLES tablename;
SELECT * FROM tablename WHERE x.
do something else
UPDATE tablename SET y WHERE x.
UNLOCK TABLES
Run Code Online (Sandbox Code Playgroud)