2010-07-02 4 views
6

MySQL의 SQL UPDATE 문에 의해 영향을받는 정확한 행을 어떻게 얻을 수 있습니까?업데이트의 영향을받는 행을 선택하십시오.

많은 컴퓨터에 많은 클라이언트가 있습니다.이 클라이언트는 언제든지 WHERE 절을 기반으로 동일한 테이블의 행을 업데이트 할 수 있으며 각 클라이언트는 영향을받는 각 행에 대해 다른 시스템에서 무언가를해야하므로 영향을받는 품목은 정확해야하며 경주 조건에 취약하지 않아야합니다.

일부 데이터베이스는 UPDATE ... OUTPUT UPDATED.id WHERE ...을 지원합니다. SQL Server.

이 원자가 어떻게 할 수 있습니까? UPDATE/SELECT?

은 (내가 먼저 SELECT을하고 다음 UPDATEIN 조항으로 ID를 사용하는 제안을 보았다. 그러나 첫 번째 클라이언트가 UPDATE 등 대기되는 동안 다른 클라이언트가 동일한 SELECT을 실행하고 동일한 행을 검색 할 수 ?)

답변

2

경쟁 조건을 방지하려면 테이블 잠금 또는 트랜잭션 (저장소 엔진에서 지원되는 경우)을 사용하십시오.

LOCK TABLES tablename; 
SELECT * FROM tablename WHERE x. 
do something else 
UPDATE tablename SET y WHERE x. 
UNLOCK TABLES 
1

이것은 내가 전에 사용한 것입니다, 그리고 그것을 here on Stackoverflow을 사용하여 다른 사람의 인스턴스가있다 : N 경우

UPDATE my_table SET 
    id = (SELECT @id := id), 
    <column> = 'value'   
    WHERE <condition>; 

@id 업데이트 행의 ID가 포함됩니다, 또는 NULL 행이 업데이트되었습니다. 이것은 단일 행 업데이트에서만 작동합니다.

관련 문제