02 트랜잭션 Lock
01 트랜잭션 동시성 제어
(1) 동시성 제어
-동시에 실행되는 트랜잭션 수를 최대화 하면서도 입력, 수정, 삭제, 검색시 데이터의 무결성이 유지될수 수 있도록 노력하는 것을 말한다.
-여러개의 트랜잭션이 동시에 수행될 때, 테이터베이스 애플리케이션은 이들 트랜색션이 서로 간섭을 일으키는 현상을 최소화 하면서 데이터의 일관성과 무결성이 보장되도록 개발되어야 한다.
-동시성 : 다중 사용자가 같은 테이터를 동시에 액세스
-일관성 : 자시이 발생시킨 변경사항과 다른 트랜잭셔의 변경 사항( 읽을 수 있는 버전만 허용)을 포함해 일관성 있는 상태로 데이터를제공
(2) 트랜잭션이란?
-여러 개의 수정작업이 하나의 작업처럼 전부 처리되거나 아예 전부 처리가 안 되도록(ALL or Nothing)하는 것인데, 이러한 일의 최소 단위가 트랜잭션이다.
(3) 트랜잭션의 특징(ACID)
-원자성(Atomicity) : 트랜잭션의 더이상 분해가 불가능한 업무의 최소단위
-일관성(Consistency) : 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않도록 하는 것
-격리성(Isolation) : 트랜잭션이 실행 중에 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다.
-영속성(Durability) : 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에서 영속적으로 저장된다.
02 트랜잭션 수준 읽71 일관성
(1) 트랜잭션 수준 읽기 일관성이란?
-문장수준 읽기 일관성(Statement-Level Read Consistency) : 쿼리가 시작된 시점을 기준으로 테이터를 일관성 있게 읽어들이는 것을 말함
-트랜잭션 수준 읽기 일관성(Transaction-Level Read Consistency) : 트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어 들이는 것을 말함.
-오라클은 완벽한 문장수준의 읽기 일관성은 보장하나 트랜잭션에 대해서는 기본적으로 보장하지 않는다.
(2) 트랜잭션 고립화 수준
-DBMS마다 구현방식이 달라 본서에서 자세히 다루는 것은 적절치 않다고 생각한다.
-ANSI/ISO SQL standard(SQL192)
레벨 0(= Read Uncommitted)
-트랜잭션에서 처리 중인/ 아직 커밋되지 않은 테이터를 다른 트랜잭션이 읽는 것을 허용.
-Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
-오라클은 이 레벨을 지원하지않음
레벨 1(=Read Committed)
-Dirty Read 방지 : 트랜잭션이 커밋되어 확정된 테이터만 읽는 것을 허용
-대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
-DB2, SQL Server, Sybase의 경우 읽기 공유 Lock을 이용해서 구현, 하나의 레코드을 읽을 때 Lock을 설정하고 해당 레코드를 빠져 나가는 순간 Lock 해제
-Oracle은 Lock을 사용하지 않고 쿼리시작 시점의 Undo 데이터를 제공하는 방식으로 구현
레벨 2(-Repeatable Read)
-선행 트랜잭션이 읽은 테이터는 트랜잭션이 종료될 때 까지 후행 트랜잭션이 갱신하거나 삭제하는 것은 불허함으로써 같은 데이터를 두 번 쿼리했을때 일관성 있는 결과를 리턴
-Phantom Read 현상은 여전히 발생
-DB2, SQL Server의 경우 트랜잭션 고립화 수준을 Repeatable Read로 변경하면 읽은 테이터에 걸린 공유 Lock을 커밋할 때까지 유지하는 방식으로 구현
-Oracle은 이 레벨을 명시적으로 지원하지 않지만 for update 절을 이용해 구현가능, SQL Server등에서도 for update절을 사용할 수 있찌만 커서를 명시적으로 선언 할 때만 사용 가능함
레벨 3(=Serializable Read)
-선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막아줌
-완벽한 읽기 일관성 모드를 제공
(3) Dirty Read(=Uncommitted Dependency)
-아직 커밋되지 않은 수정 중인 테이타를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생한다.
-오라클은 다중 버전 읽기 일관성 모델을 채택함으로써 Lock을 사용하지 않고도 Dirty Read를 피해 일관성 있는 데이터 읽기가 가능하고, 따라서 레벨 0수준으로 트랜잭션 고립화 수준으로 트랜잭션 고립화 수준을 낮추는 방법을 제공하지 않음.
(4) Non-Repeatable Read(= Inconsistent Analysis)
-한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두쿼리의 결과가 상이하게 나타는 비 일관성이 발생하는 것을 말한다.
(5) Phantom Read
-한 트랜잭션 안에서 일정 범위의 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번재 쿼리에서 나타난현상.(이는 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타나는 현상임)
-Phantom Read현상을 방지하려면 트랜잭션 고립화 수준을 레벨3으로 올려 주어야 한다.