트랜잭션 - 3

초보개발·2022년 3월 25일
0

Database

목록 보기
8/10

병행 제어

병행 수행과 병행 제어

DBMS는 여러 사용자가 데이터베이스를 동시 공유할 수 있도록 여러 개의 트랜잭션이 동시에 수행되는 병행 수행 기능을 제공한다.
병행 수행 중, 다른 트랜잭션이 같은 데이터에 동시에 접근해 변경 연산을 수행하려고 하면 잘못된 결과가 나타날 수 있어 각각의 트랜잭션이 다른 트랜잭션에 방해 받지 않고 정확한 수행 결과를 얻을 수 있도록 제어해야 한다.
여러 개의 트랜잭션이 병행 수행되면서 같은 데이터에 접근해 수행하더라도 정확한 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것을 병행 제어(concurrency control)이라고 한다.

병행 수행의 문제

갱신 분실(lost update)


갱신 분실은 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어씌워 변경 연산이 무효화 되는 것이다.
위의 예시처럼 트랜잭션 T1의 연산 결과가 데이터베이스에 반영되지 않고 무효화 되어 트랜잭션 T1이 수행되지 않은 것처럼 되어버린다. 즉, 트랜잭션 T1에 대해 갱신 분실이 발생한 것이다.

그림의 3000 * 0.5에서 3000은 4000으로...
위와 같이 순차적으로 실행된다면 트랜잭션을 수행한 결과를 모두 반영할 수 있게 된다.

모순성(Inconsistency)

모순성은 하나의 트랜잭션이 여러 개의 데이터 변경 연산을 실행할 때, 일관성 없는 상태의 데이터베이스에서 데이터를 가져와 연산을 실행하여 모순된 결과가 발생하는 것이다.

연쇄 복귀(Cascading rollback)

트랜잭션이 완료되기 전, 장애가 발생해 rollback 연산을 수행하면, 이 트랜잭션이 장애 발생 전에 변경한 데이터를 가져가 변경 연산을 실행한 또 다른 트랜잭션에도 rollback 연산을 연쇄적으로 실행해야 한다는 것이다.
하지만, 장애가 발생한 트랜잭션이 rollback 연산을 실행하기 전에, 변경한 데이터를 가져가 사용하는 다른 트랜잭션이 수행을 완료해버리면 rollback 연산을 실행할 수 없어 큰 문제가 발생한다.

병행 제어 기법

병행 제어 기법은 여러 트랜잭션을 병행 수행하면서도 정확한 결과를 얻을 수 있는 직렬 가능성을 보장받기 위해 사용한다.

로킹 기법

로킹 기법은 병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하도록 lock, unlock이라는 2개의 연산을 이용해 제어한다.
한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 모두 마칠 때까지 해당 데이터에 다른 트랜잭션이 접근하지 못하도록 mutual exclusion하여 직렬 가능성을 보장하는 것이다.

  • lock: 트랜잭션이 사용할 데이터에 대한 독점권을 가지기 위해 사용한다.
  • unlock: 트랜잭션이 데이터에 대한 독점권을 반납하기 위해 사용한다.

트랜잭션이 데이터에 read, write 연산을 실행하기 전, 반드시 lock 연산을 실행해야 한다. 다른 트랜잭션이 lock 연산을 실행한 데이터는 unlock되기 전까지 또 lock 연산을 실행할 수 없다. unlock으로 그 데이터에 대한 독점권을 반납해야 다른 트랜잭션이 해당 데이터에 접근할 수 있게 된다.

로킹 단위가 만약 전체 데이터베이스 단위라면, 제어가 간단하지만 데이터베이스에 하나의 트랜잭션만 수행되므로 병행 수행이라고 할 수 없다. 가장 작은 단위인 애트리뷰트로 실행한다면 범위가 좁아 많은 수의 트랜잭션을 병행 수행할 수 있다는 장점이 있으나 제어가 그만큼 복잡해진다. 따라서 적절한 로킹 단위를 찾는 것이 중요하다.

0개의 댓글