CS/DataBase

Lock 과 트랜잭션 동시성 제어

prden 2022. 12. 29. 14:19

1. Lock

영화관 예약 시스템에서 두 명이 동시에 한 좌석을 요청할 때 정확히 한명만 좌석을 배정받을 수 있도록 해야한다. 이 때 사용되는 개념이 Lockdlek.

 

가. 공유적 Lock(Shared Lock)

공유 Lock은 데이터를 읽을 때 사용한다. 공유 Lock을 설정한 리소스에 다른 트랜잭션이 추가로 공유 Lock을 설정할 수 있지만, 배타적 Lock은 설정 불가능하다. 따라서 자신이 읽고 있는 리소스를 다른 사용자가 동시에 읽을 수는 있어도 변경은 불가능하다. 또한, 다른 사용자가 읽고 있는 리소스를 동시에 읽을 수 는 있어도 변경은 불가능하다.

 

나. 배타적 Lock

배타적 Lock은 데이터를 변경할 때 사용하며, 트랜잭션이 완료될 때까지 유지된다. 배타적 Lock은 Lock이 해제될 때까지 다른 트랜잭션은 해당 리소스에 접근할 수 없다. 변경 불가능할 뿐만 아니라 읽을 수도 없다. 

 

다. 블로킹

블로킹은 Lock 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춰선 상태를 의미한다. 공유 Lock끼리는 호환되기 때문에 블로킹이 발생하지 않고 공유 Lock과 배타적 Lock은 호환되지 않아 블로킹이 발생한다. 배타적 Lock끼리는 당연히 호환되지 않는다. 

Lock 발생 방지 방법

 1) 트랜잭션을 짧게 정의 한다. 

 2) 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 한다. (ex 대용량 갱신 작업은 새벽에)

 3) 결과가 가장 빠르게 나오는 SQL을 작성하도록 한다. 

라. 교착상태

두 세션이 각각 Lock을 설정한 리소스를 서로 액세스하려고  마주 보며 진행하는 상황을 말한다. 교착 상태가 발생하면 DBMS가 둘 중 한 세션에 에러를 발생시킴으로써 문제를 해결한다. 

 

마. DML Lock

 1) 로우 Lock

 insert, update, delete 문이나 select for update 문을 수행한 트랜잭션에 의해 설정된다. 일반 select문에 의해 얽힌 레코드는 어떤 Lock도 설정되지 않음.  예를 들어 읽으려는 데이터를 다른 트랜잭션이 갱신중이더라도 기다리지 않는다, 갱신하려는 데이터를 다른 트랜잭션이 읽는중이더라도 기다리지 않는다, 갱신하려는 데이터를 다른 트랜잭션이 갱신중이면 기다린다. 

 

2) 테이블 Lock

한 트랜잭션이 로우 Lock을 얻을 때 해당 테이블의 테이블 Lock도 동시에 얻는다. 이렇게 하는 것은 현재 트랜잭션이 갱신중인 테이블의 구조를 변경하지 못하게 막기 위해서이다.

 

테이블 Lock의 종류

Row Share (RS) : select ... for update 문을 수행할 때 RS 모드 테이블 Lock 걸림

Row Exclusive (RX) : insert, update, delete문을 수행할 때 RX 모드 테이블 Lock 걸림

Share

Share Row Exclusive

Exclusive

 

2. 트랜잭션(TCL) = 데이터베이스의 논리적 연산 단위

트랜잭션은 밀접힌 관련돼 분리될 수 없는 한 개 이상의 데이터베이스 조작을 가리킨다. 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함된다.즉, 하나의 트랜잭션이 두 개 이상의 갱신 연산일 수 있는 것이다.

DDL의 경우(CRATE, ALTER, DROP, RENAME, TRUNCATE 등) 자동으로 커밋됨.

데이터 베이스를 정상적으로 접속 종료하면 DML 자동으로 트랜잭션이 커밋된다.

애플리케이션의 이상 종료로 데이터베이스와 접속이 단절될 경우 자동 롤백된다.

 

 1) COMMIT

   (데이터 처리내역을 최종적으로 반영)

  COMMIT [WORK];

 

 2) ROLLBACK

   (데이터베이스에  가해진 변경사항을 취소)

  ROLLBACK [WORK]  [TO [SAVEPOINT] 세이브포인트명];

--> COMMIT은 작업이 성공했을 때, ROLLBACK은 작업이 실패했을 때 작성

따라서 BEGIN 하단에 COMMIT을 명시하고 ROLLBACK은 예외처리와 함께 사용되므로 특정 예외가 발생했을 때 예외처리 구문에 ROLLBACK을 명시한다. 

 

3) SAVEPOINT

   ( ROLLBACK을 명시하면 작업 전체가 취소되는데, 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있다.) 

취소하려는 지점을 명시하고 그 지점까지 작업을 취소하는 형태로 사용하는데 이 지점을 SAVEPOINT라고 함

 

3. 동시성 제어

p789

'CS > DataBase' 카테고리의 다른 글

ORACLE 식별자  (0) 2022.12.31
DB ConnectionPool  (0) 2022.12.30
Oracle PL/SQL  (0) 2022.12.29
ORACLE 프로시저  (0) 2022.12.21
MySQL data Directory의 위치  (0) 2022.12.21