문제

이것은 mysql (innodb)로 레이스 조건을 유발합니까 :

  1. 트랜잭션을 시작하십시오.

  2. 기록을 얻으십시오.

  3. 레코드가 존재하지 않으면 반환하십시오.

  4. 레코드가 존재하면 삭제하고 로그 항목을 추가하여 삭제되었습니다.

  5. 최종 거래 (커밋/롤백).

2B에서 삭제 단계 직전에 다른 프로세스가 시작될 수 있고 레코드의 존재를 감지 한 다음 두 프로세스가 로그에 항목 삭제 항목을 입력하도록 할 수 있습니까?

내가 취해야 할 예방 조치가 있습니까?

감사.

도움이 되었습니까?

해결책

2 단계에서 '업데이트를 위해 선택'을 사용하십시오. 하나의 프로세스 만 행에 잠그면 설명 된 시나리오를 피할 수 있습니다.

다른 팁

Journeyman 프로그래머는 올바른 솔루션을 가지고 있다고 생각합니다. 깨진 ORM 도구를 사용하고 있다고 표시하기 때문에 (업데이트를 위해 쿼리 할 수없는 것) 로그 테이블에 삽입물을 삭제 작업의 트리거로 이동하여 중복을 피할 것을 제안합니다. 기입.

트랜잭션을 시작하십시오.

레코드 삭제 / * '레코드를 얻으십시오' * /에 사용하는 동일한 기준을 사용하여 삭제하십시오.

응답에 레코드가 실제로 삭제되었음을 나타내면 로그 항목을 추가하십시오.

최종 거래 (커밋/롤백).

더 이상 인종 조건이 없습니다.

예, 다른 트랜잭션이 테이블을 읽은 후에 테이블을 확인할 수 있습니다.

더 나쁜 것은, 트랜잭션의 작동 방식으로 인해 행을 삭제 한 후에도 시작된 새로운 트랜잭션은 아직 삭제를 커밋하지 않았기 때문에 행을 볼 수 있습니다.

SELECT ... FOR UPDATE 그것을 막는 한 가지 방법입니다.

LOCK TABLE tablename 또 다른 것입니다.

불행히도, 당신이 ORM을 사용하고 있기 때문에, 나는 그것이 이것들 중 하나를 수행 할 수 있는지 여부를 말할 수 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top