MySQL 레이스 조건
-
18-09-2019 - |
문제
이것은 mysql (innodb)로 레이스 조건을 유발합니까 :
트랜잭션을 시작하십시오.
기록을 얻으십시오.
레코드가 존재하지 않으면 반환하십시오.
레코드가 존재하면 삭제하고 로그 항목을 추가하여 삭제되었습니다.
최종 거래 (커밋/롤백).
2B에서 삭제 단계 직전에 다른 프로세스가 시작될 수 있고 레코드의 존재를 감지 한 다음 두 프로세스가 로그에 항목 삭제 항목을 입력하도록 할 수 있습니까?
내가 취해야 할 예방 조치가 있습니까?
감사.
해결책
2 단계에서 '업데이트를 위해 선택'을 사용하십시오. 하나의 프로세스 만 행에 잠그면 설명 된 시나리오를 피할 수 있습니다.
다른 팁
Journeyman 프로그래머는 올바른 솔루션을 가지고 있다고 생각합니다. 깨진 ORM 도구를 사용하고 있다고 표시하기 때문에 (업데이트를 위해 쿼리 할 수없는 것) 로그 테이블에 삽입물을 삭제 작업의 트리거로 이동하여 중복을 피할 것을 제안합니다. 기입.
트랜잭션을 시작하십시오.
레코드 삭제 / * '레코드를 얻으십시오' * /에 사용하는 동일한 기준을 사용하여 삭제하십시오.
응답에 레코드가 실제로 삭제되었음을 나타내면 로그 항목을 추가하십시오.
최종 거래 (커밋/롤백).
더 이상 인종 조건이 없습니다.
예, 다른 트랜잭션이 테이블을 읽은 후에 테이블을 확인할 수 있습니다.
더 나쁜 것은, 트랜잭션의 작동 방식으로 인해 행을 삭제 한 후에도 시작된 새로운 트랜잭션은 아직 삭제를 커밋하지 않았기 때문에 행을 볼 수 있습니다.
SELECT ... FOR UPDATE
그것을 막는 한 가지 방법입니다.
LOCK TABLE tablename
또 다른 것입니다.
불행히도, 당신이 ORM을 사용하고 있기 때문에, 나는 그것이 이것들 중 하나를 수행 할 수 있는지 여부를 말할 수 없었습니다.