데이터베이스 동시성

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

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

커밋하고자 하는 트랜잭션은 데이터베이스의 동시성을 보호해야 하고 각각의 트랜잭션은 적합한 결과를 보장해야 한다. 다른 트랜잭션이 수행 중일 때 트랜잭션 내의 이벤트는 다른 트랜잭션에게 보이지 않아야 하며, 이를 격리성(isolation)이라 한다. 트랜잭션의 격리 수준(isolation level)은 동시에 수행되는 다른 트랜잭션으로부터 간섭 받는 것을 허용하는 정도의 단위이다. 격리 수준이 높을수록 간섭을 덜 받게 되고 낮을수록 동시성이 높아진다. 일관성(consistency)과 동시성(concurrency), 이 두 개의 요소는 격리 수준에 의해 조정되며, 적용하고자 하는 서비스에 따라 격리 수준을 결정하여야 한다.

CUBRID가 지원하는 격리 수준은 성능 튜닝 > 데이터베이스 서버 설정 > 동시성/잠금 파라미터를 참조한다.

CUBRID는 정교한 잠금 테크닉을 이용하여 동시 접근을 통제한다. 어떤 유형의 데이터라도 접근에 필요한 잠금은 응용 프로그램의 힌트 없이 자동으로 결정된다(사용자의 개입이 필요 없다). 요청된 연산에 의하여 검색과 갱신 연산을 수행하기 위해, CUBRID는 각각 읽기 잠금과 쓰기 잠금을 획득한다. 데이터베이스 전체를 잠그는 것뿐만 아니라 특정 클래스, 인스턴스, 인덱스를 잠글 수도 있다.

격리 수준은 다음의 세가지 개념의 용어로 설명될 수 있다.