-
Notifications
You must be signed in to change notification settings - Fork 0
1조 240821 트랜잭션 학습
June edited this page Aug 21, 2024
·
2 revisions
- 더티 리드 허용
- 변경 사항이 InnoDB버퍼 풀에 저장되는데 이걸 직접 접근한다.
- 버퍼 풀에 저장된 데이터에 접근하지 않고, commit된 데이터에만 접근
- 더티 리드는 발생하지 않음
-
하나의 트랜잭션 내에서 동일한 읽기 결과를 보장. 즉, 하나의 트랜잭션 내에서 반복가능한 읽기가 가능하다는 의미이다.
-
Repeatable read는 트랜젝션의 새로운 레코드의 추가를 막지 않기 때문에 최초
SELECT .. FOR UPDATE
를 호출한 뒤에도 새로운 레코드가 생성/삭제될 수 있다. 따라서 같은 트랜젝션 내에서SELECT ... FOR UPDATE
가 호출되는 시점에 따라 일관되지 않은 레코드가 조회될 수 있다.# tx-1 start SELECT * FROM xxx; # result set: 1건, (1시 1분 1초) SELECT * FROM xxx FOR UPDATE; # result set: 2건, (1시 1분 5초) # tx-2 commit # tx-2 start INSERT INTO xxx; # (1시 1분 2초 ) # tx-2 commit
- 실제로 순차적으로 실행되는 것이 아닌 순차적으로 실행되는 것과 결과가 동일하도록 구현한 것
만약 두 가지 버전의 데이터가 존재하는 상황에서 새로운 사용자가 데이터에 접근하면 데이터베이스의 Snapshot을 읽는다. 그러다가 변경이 취소되면 원본 Snapshot을 바탕으로 데이터를 복구하고, 만약 변경이 완료되면 최종적으로 디스크에 반영하는 방식으로 동작한다.
- 데이터의 값을 변경할 때, 변경한 데이터를 저장한다.
- 변경한 데이터는 MySQL 백그라운드 스레드에 의해 특정 시점에 디스크에 반영한다.
- 트랜잭션이 실행되는 시점에 변경전 데이터를 백업해둔 로그이다.
- 트랜잭션의 격리 수준을 보장하기 위해 사용된다.
- 트랜잭션 보장 : 트랜잭션이 롤백되면 undo 로그에 백업된 데이터로 복원한다.
- 격리수준 보장 : 특정 트랜잭션에서 데이터를 변경하는 도중에, 다른 트랜잭션에서 데이터를 조회하는 상황에서 격리수준에 맞는 데이터를 반환할 수 있다.
- 시스템 장애가 발생했을 경우, undo 로그를 보며 롤백시킨다.
- 변경 후 데이터: 시스템 복구 또는 성능 향상