제시문
최근 빅데이터, 소셜 네트워크 서비스 등 대용량 웹서비스를 제공하기 위해 비관계형 데이터베이스가 도입되고 있지만, 정형 데이터를 안정적으로 처리하기 위해서 가장 많이 활용되고 있는 것은 관계형 데이터베이스이다. 관계형 데이터베이스 및 정보 시스템 개발 과정에서 데이터베이스의 체계적 관리를 위한 소프트웨어인 DBMS가 어느 것인지에 상관없이, 데이터를 관리할 수 있도록 표준 질의언어인 SQL이 활용되고 있다.
데이터베이스 트랜잭션은 계좌이체, 주문 처리 등과 같이 한꺼번에 처리해야 하는 논리적 업무 단위를 말한다. 트랜잭션에는 SQL의 조회·삽입·삭제·갱신 등의 작업이 포함된다. 조회작업으로만 구성된 트랜잭션은 데이터베이스 내용을 변화시키지 않는다. 트랜잭션의 개념은 데이터베이스의 안전성을 유지하는 데 필수적이다. 예를 들어 계좌이체의 경우, 도중에 오류가 발생하여 출금 계좌에서 돈이 빠져나갔지만 입금 계좌에는 돈이 안 들어온 상황이 발생해서는 안 된다. 입출금 작업이 모두 성공적으로 종료되어야 이를 완전한 거래로 승인하여 '완료'하고, 일부라도 오류가 발생했을 때는 거래를 아예 진행하지 않은 상태로 '롤백'하여 거래의 안전을 확보해야 하는 것이다.
트랜잭션이 반드시 충족해야 하는 특성으로 원자성·일관성·격리성 등이 있다. 원자성은 계좌이체의 예에서 설명한 바와 같이 트랜잭션의 모든 작업이 성공적으로 완료되거나 아예 아무것도 실행되지 않아야 한다는 특성을 말한다. 일관성은 트랜잭션의 실행 전과 후 모두 데이터베이스에 정의된 무결성 제약조건을 충족하여 논리적으로 일관된 상태를 유지해야 함을 의미한다. 격리성은 둘 이상의 트랜잭션을 동시에 실행할 때 상호 간섭에 의한 문제를 일으키지 않는 성질로, 이를 만족한다면 트랜잭션의 동시 실행의 결과는 트랜잭션을 순차적으로 실행하였을 때의 결과와 같다.
㉠++트랜잭션의 동시성 제어++는 다중 사용자 환경에서 트랜잭션의 일관성과 격리성을 보장하기 위해 DBMS가 제공하는 기능이다. 동시성 제어를 하지 않으면 트랜잭션이 서로 충돌하여 갱신 분실 문제와 모순된 읽기 문제가 발생할 수 있다. 두 트랜잭션이 동일 데이터를 동시에 갱신할 때 한 트랜잭션의 갱신이 다른 트랜잭션이 갱신한 내용을 덮어 쓸 수 있는데, 이를 갱신 분실이라 한다. 모순된 읽기에는 오염된 읽기·반복 불가능한 읽기·팬텀 읽기가 있다. 오염된 읽기는 두 트랜잭션이 동시에 같은 데이터에 접근할 때 한 트랜잭션이 데이터를 갱신한 후 이를 완료하기 전에 다른 트랜잭션이 이 데이터를 읽었으나 이후 데이터 갱신작업을 롤백할 경우 발생하는 문제이다. 반복 불가능한 읽기는 한 트랜잭션 내에서 같은 데이터를 여러 번 조회하는 도중에 다른 트랜잭션이 해당 데이터값을 갱신한 후 완료하면 같은 질의의 결과가 서로 달라지는 문제를 말한다. 팬텀 읽기는 한 트랜잭션에서 질의를 통해 레코드 세트를 읽었지만 다른 트랜잭션이 레코드를 삽입한 후 같은 질의를 반복할 때, 이전과 다른 레코드 세트를 조회하는 현상을 말한다.
한편 SQL에서는 트랜잭션의 동시성 제어를 위한 네 단계의 격리성 수준을 정의한다. 가장 낮은 단계인 미완료 읽기는 완료되지 않은 데이터도 읽을 수 있어 모든 유형의 모순된 읽기가 발생할 수 있다. 다음으로 완료 읽기는 미완료 데이터를 읽지 못하도록 하여 오염된 읽기를 막을 수 있다. 세 번째 단계인 반복 가능 조회는 한 트랜잭션에서 하나의 스냅숏만 사용하도록 하여 오염된 읽기와 반복 불가능한 읽기는 발생하지 않으나, 팬텀 읽기를 막을 수는 없다. 마지막 단계인 직렬화 가능 실행은 2단계 잠금과 같은 기법을 사용하여 트랜잭션의 순차적 실행을 보장함으로써 최고 수준의 격리성을 제공한다. 잠금의 기본 원리는 한 트랜잭션이 자신이 먼저 접근한 데이터를 잠가 다른 트랜잭션의 접근을 막고, 작업을 마치면 이를 풀어 다른 트랜잭션이 사용할 수 있도록 하는 것이다. 이러한 기본 방식의 잠금은 데이터의 독점적 사용으로 인해 동시성을 현저히 저해하며, 또한 트랜잭션의 직렬화 가능 실행을 보장하지 못한다. 이 두 문제를 해결하기 위해 등장한 2단계 잠금은 항상 직렬화 가능 트랜잭션 실행을 보장한다. 일반적으로 격리성 수준이 높을수록 트랜잭션의 독립성이 강해지지만, 성능 및 동시성은 저하된다.