Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

데이터베이스 동시성

다수의 사용자들이 데이터베이스에서 읽고 쓰는 권한을 가질 때, 한 명 이상의 사용자가 동시에 같은 데이터에 접근할 가능성이 있다. 데이터베이스의 무결성을 보호하고, 사용자와 트랜잭션이 항상 정확하고 일관된 데이터를 지니기 위해서는 다중 사용자 환경에서의 접근과 갱신에 대한 통제가 필수적이다. 적정한 통제가 없으면 데이터는 어긋난 순서로 부정확하게 갱신될 수 있다.

대부분의 상용 데이터베이스 시스템과 마찬가지로 CUBRID도 데이터베이스 내의 동시성(concurrency)을 위한 기본 요소인 직렬성(serializability)을 수용한다. 직렬성이란 여러 트랜잭션이 동시에 수행될 때, 마치 각각의 트랜잭션이 순차적으로 수행되는 것처럼 트랜잭션 간 간섭이 없다는 것을 의미하며, 트랜잭션의 격리 수준(isolation level)이 높을수록 보장된다. 이러한 원칙은 원자성(atomic, 트랜잭션의 모든 영향들은 커밋되거나 롤백되어야 함)을 갖는 트랜잭션이 각각 수행된다면, 데이터베이스의 동시성이 보장된다는 가정에 기초하고 있다. CUBRID에서 직렬성은 잘 알려진 2단계 잠금 기법을 통해 관리된다. 이것은 잠금 프로토콜에서 설명한다.

커밋하고자 하는 트랜잭션은 데이터베이스의 동시성을 보장하고, 적합한 결과를 보장해야 한다. 여러 트랜잭션이 동시에 수행 중일 때, 트랜잭션 T1 내의 이벤트는 트랜잭션 T2에 영향을 끼치지 않아야 하며, 이를 격리성(isolation)이라 한다. 즉, 트랜잭션의 격리 수준(isolation level)은 동시에 수행되는 다른 트랜잭션으로부터 간섭받는 것을 허용하는 정도의 단위이다. 격리 수준이 높을수록 트랜잭션 간 간섭이 적으며 직렬적이고, 격리 수준이 낮을수록 트랜잭션 간 간섭이 많고 병렬적이며 동시성이 높아진다. 이러한 트랜잭션의 격리 수준에 따라 데이터베이스는 테이블과 레코드에 대해 어떤 잠금을 획득할지 결정한다. 따라서, 적용하고자 하는 서비스의 특성에 따라 격리 수준을 적절히 설정함으로써 데이터베이스의 일관성(consistency)과 동시성(concurrency)을 조정할 수 있다.

사용자는 SET TRANSACTION ISOLATION LEVEL 문을 사용하거나 CUBRID가 지원하는 동시성/잠금 파라미터를 이용하여 격리 수준을 설정할 수 있다. 이에 관한 설명은 동시성/잠금 파라미터를 참조한다.

트랜잭션 격리 수준 설정을 통해 트랜잭션 간 간섭을 허용할 수 있는 읽기 연산의 종류는 다음과 같다.

  • 더티 읽기(dirty read): 트랜잭션 T1가 데이터 D를 D’로 갱신한 후 커밋을 수행하기 전에 트랜잭션 T2가 D’를 읽을 수 있다.
  • 반복할 수 없는 읽기(non-repeatable read, unrepeatable read): 트랜잭션 T1이 데이터를 여러 번 조회하는 중에 다른 트랜잭션 T2가 데이터를 수정하는 경우, 트랜잭션 T1은 다른 값을 읽을 수 있다.
  • 유령 읽기(phantom read): 트랜잭션 T1에서 데이터를 여러 번 조회하는 중에 다른 트랜잭션 T2가 새로운 레코드 E를 삽입한 경우, 트랜잭션 T1은 E를 읽을 수 있다.

CUBRID에서 트랜잭션 격리 수준의 기본 설정은 REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES (3)이다.

CUBRID가 제공하는 격리 수준

CUBRID 격리 수준
(isolation_level)

타 DBMS 격리 수준
(isolation_level)

더티
읽기

반복할 수
없는 읽기

유령
읽기

조회 중인 테이블에
대한 스키마 갱신

SERIALIZABLE (6)

SERIALIZABLE (4)

N

N

N

N

REPEATABLE READ CLASS with REPEATABLE READ INSTANCES (5)

REPEATABLE READ (3)

N

N

Y

N

REPEATABLE READ CLASS with READ COMMITTED INSTANCES (4)

READ COMMITTED (2)

N

Y

Y

N

REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES (3)

READ UNCOMMITTED (1)

Y

Y

Y

N

READ COMMITTED CLASS with READ COMMITTED INSTANCES (2)

 

N

Y

Y

Y

READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES (1)

 

Y

Y

Y

Y