2011-09-23 3 views
4

나는 혼란 스럽다. Oracle에서 MVCC에 대해 읽었습니다. 나는 MVCC가 잠금 장치가 없다고 생각했다. 그러나 나는 어딘가 다른 곳에서 모두 UPDATE이 격리 수준에 관계없이 자동 잠금을 수행한다고 읽었습니다. 오라클 업데이트 중에 어떤 일이 일어날 지 설명 할 수 있습니까? 그리고 여러 개의 읽기 커밋 된 트랜잭션이 동시에 수행하려고 시도 할 때 어떤 일이 발생합니까? update t set c = c + 1 where id = 3. 결과는 무엇입니까? 트랜잭션 전에 c = 1이 주어졌고 잠금 장치와 SCN은 어떻게됩니까?Oracle의 동시 업데이트 : 잠금 여부

Begin T1 
Begin T2 
T1: update t set c = c + 1 where id = 3 
T2: update t set c = c + 1 where id = 3 
Commit T1 
Commit T2 

답변

6

맞아요, 분리 수준에 관계없이 행을 잠급니다. MVCC를 사용하면 잠금없이 일관성있는 읽기를 얻을 수 있지만 여전히 쓰기 작업시 잠금이 필요합니다.

두 번째 트랜잭션은 아무것도 수행하기 전에 첫 번째 트랜잭션이 완료 될 때까지 기다립니다 (예 : COMMIT 또는 ROLLBACK). 따라서이 경우 T2의 커서는 업데이트를 기다리고 T1이 끝나기를 기다립니다.

T1이 커밋되고 T2가 커밋 된 후에 새 SCN이 생성됩니다.

+0

감사합니다. 그래서 MVCC는이 잠금이 읽기에는 영향을 미치지 않는다는 것을 의미합니다. 그렇습니까? id = 3 인 동일한 레코드에 다른 레코드가 기록됩니까? –

+0

@RonGarrity 그래. 오라클은 실행 취소 로그를 사용하여 연결된 모든 세션에 데이터베이스 일관성있는보기를 제공 할 수 있습니다. – NullUserException