✅ Lost Update란?
동시에 시작한 2개의 트랜직션에서 같이 업데이트를 하면 나중에 업데이트한 값으로 덮어씌워지는 현상을 말한다.>
✅ 같은 상황에서의 오라클은 어떻게 갱신될까?🤔
- Consistent 모드로 읽기 때문에 TX2에서는 애초에 Sal값이 2000인 로우가 조회되지 않는다.
- 따라서 TX2는 갱신에 실패하여 최종 Sal값은 2000이 된다.😥
오라클의 데이터 갱신 과정
- 조회한 조건에 따라 수정/삭제할 대상 레코드의 rowid를 Consistent 모드로(DML 문이 시작된 시점 기준) 찾는다.
- 앞에서 읽은 rowid가 가리키는 레코드를 찾아가 로우 Lock을 설정한 후에 Current 모드로(값이 변경되는 시점 기준) 실제 update/delete를 수행한다.
이 단계에서 Current 모드로 다시 한번 조건을 필터링하고, 갱신할 값을 읽어 수정/삭제한다.- ❗️1번 단계를 수행해 대상건을 '모두' 추출하고 나서 2번 단계를 수행하는것이 아니라, 1번 단계에서 커서를 열어 Fetch하면서 2번 단계를 건건히 반복 수행한다.
update 계좌2 set 총잔고 = 계좌2.잔고 +
(select 잔고 from 계좌1 where 계좌번호 = 계좌2.계좌번호)
where 계좌번호 = 7788;
✅ 오라클의 Restart 매커니즘 과정
- 일단 UPDATE를 한다.
- 이 때 부하 감소 및 동시성 유지를 위해 낙관적 동시성 제어 모드로 update한다.
- 일관성을 해칠만한 상황(조건절 컬럼 값이 변경되는 경우..)이 생기면 처리를 롤백한다.
- SELECT FOR UPDATE 모드로 Lock 설정 하고 다시 UPDATE를 수행한다.