0
나는 동시 근로자 사이에 행을 배포하는이 쿼리를 사용 이 쿼리로 인해 교착 상태가 발생하는 이유는 무엇입니까?
SET @update_id := 0;
UPDATE tablename
SET processed = -1, id = (SELECT @update_id := id)
WHERE processed = 0
LIMIT 1
SELECT @update_id as id;
는 때때로 교착 상태 예외를 던지고 난 그냥 다시 시작했습니다. 그러나 충분한 작업자 수가 많으면 매회 교착 상태가되어 재시도 루프에 걸릴 수 있습니다. 올바르게 다시 쓰는 방법?
정상적으로 작동해야합니까? select 하위 쿼리가 반환 된 후 업데이트가 발생하기 전에 행이 수정되면 어떻게됩니까? 0 행이 수정되면 반환 값을 확인하고 쿼리를 다시 시작해야합니까? – Poma
'AND processed = 0'은 그것을 방지해야합니다. 예, 0 행이 수정되거나 0이 반환되면 검색어를 다시 시작해야합니다. 'processed = 0'이있는 행이 있는지 확인해야하므로 무한 루프가 발생하지 않습니다. 대체 접근법은 -1 대신에 ProcessId를 설정하는 것이고, 어떤 경우에는 추락 된 프로세스를 다뤄야 만합니다. '업데이트 된 tn 세트 처리 = 처리 된 값 = 0 한계 1; tn에서 처리 된 ID를 선택하십시오. = ' –
' 일반 오류 : 1093 FROM 절의 업데이트에'tablename '대상 테이블을 지정할 수 없습니다. – Poma