의 사용 사례를 이해하도록 도와주세요 SELECT ... FOR UPDATE
.
질문 1 : 다음은 언제 SELECT ... FOR UPDATE
사용해야하는지에 대한 좋은 예 입니까?
주어진:
- 방 [id]
- 태그 [ID, 이름]
- room_tags [room_id, tag_id]
- room_id 및 tag_id는 외래 키입니다.
애플리케이션은 모든 룸과 해당 태그를 나열하려고하지만 태그가없는 룸과 제거 된 룸을 구분해야합니다. SELECT ... FOR UPDATE를 사용하지 않으면 다음과 같은 일이 발생할 수 있습니다.
- 처음에는 :
- 방 포함
[id = 1]
- 태그에는
[id = 1, name = 'cats']
- room_tags 포함
[room_id = 1, tag_id = 1]
- 방 포함
- 스레드 1 :
SELECT id FROM rooms;
returns [id = 1]
- 스레드 2 :
DELETE FROM room_tags WHERE room_id = 1;
- 스레드 2 :
DELETE FROM rooms WHERE id = 1;
- 스레드 2 : [트랜잭션 커밋]
- 스레드 1 :
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
- 빈 목록을 반환
이제 스레드 1은 방 1에 태그가 없다고 생각하지만 실제로 방은 제거되었습니다. 이 문제를 해결하려면 스레드 1이이어야합니다. 그러면 스레드 1이 완료 될 때까지 스레드 SELECT id FROM rooms FOR UPDATE
2가 삭제되지 rooms
않습니다. 그 맞습니까?
질문 2 : 언제 하나를 사용해야 SERIALIZABLE
트랜잭션 격리가 대 READ_COMMITTED
와 SELECT ... FOR UPDATE
?
답변은 이식 가능해야합니다 (데이터베이스에 한정되지 않음). 가능하지 않은 경우 이유를 설명해주세요.
REPEATABLE_READ
과 READ_COMMITTED
휴대용 옵션이 있습니까? 내가 얻은 유일한 결과는 MSSQL 서버에 대한 것입니다
READ COMMITTED
모드 설정 은 실제로 다른 트랜잭션에 의해 커밋 된 레코드를 볼지 여부를 정의하지 않습니다. 이는 커밋되지 않은 레코드를 결코 볼 수 없다는 것을 확인합니다.
select ... for update
에는 rooms
여전히 수 room_tags
들이 별도의 테이블이기 때문에 삭제 될 수 있습니다. for update
조항이에서 삭제를 방지 하는지 물어 보려고 했습니까 rooms
?