Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 블로그

[데이터베이스]트랜잭션의 동시성과 lock 본문

전공 공부/데이터베이스

[데이터베이스]트랜잭션의 동시성과 lock

토산인 2022. 12. 18. 11:52

트랜잭션의 동시성 제어 문제와 잠금에 대해 알아본다.

 

동시성 제어(concurrency control) 문제란?

DBMS는 서버로 운용되므로, 여러 클라이언트가 동시에 접속해 삽입, 수정, 삭제, 검색을 할 수 있다. 이러한 트랜잭션을 실행하는데 서로 간의 간섭으로 부정확한 결과가 발생하는 문제를 동시성 제어 문제라고 한다. 

예를 들어 상품 테이블에 1억개의 데이터가 있을 때, 사용자 A가 1억개의 모든 데이터를 일괄로 변경하고 있는 중간에 사용자 B가 특정 데이터를 수정하는 경우, 최종 결과를 예측할 수 없다. DBMS는 동시성을 제어하기 위해 LOCK을 사용한다. 

 

 

잠금(Lock)이란?

잠금은 데이터를 잠가서 읽거나 쓰지 못하게 막는 것을 말한다. 즉 해당 데이터를 읽거나 쓰는데 필요한 권한이다. 

명시적인 잠금: 명시적인 구문으로 데이터를 잠그는 것

ex) 레코드 락: SELECT .., FOR WRITE, SELECT ... FOR SHARE, 테이블 락: LOCK TABLE ...

묵시적인 잠금: 질의의 특성상 자동으로 잠금이 되는 것

ex) UPATE, DELETE

 

read lock (shared lock)

데이터를 읽을 때 사용하는 잠금이다. 한 데이터에 여러 사용자(세션)가 read lock을 가질 수 있고, read lock이 걸리면 데이터를 수정할 수 없다.

write lock (exclusive lock)

데이터를 읽거나 쓸 때 사용하는 잠금이다. 한 데이터에 한 세션만 접근할 수 있고, lock을 건 세션만 데이터에 접근할 수 있따. 

table lock: 테이블 전체 데이터를 범위로 잠금을 거는 것

record lock: 레코드 범위로 잠금을 거는 것으로, 잠금의 범위를 최소화해 다른 세션들의 대기시간을 줄여준다.

 

 

공유 lock과 배타 lock의 관계

공유 lock의 목적은 데이터 읽기의 일관성이다. 여러 세션들이 공유 lock을 획득하여 동시에 데이터를 읽을 수 있지만, lock이 걸려있을 때 데이터의 변경이 일어나서는 안되므로 공유 lock이 걸려있 경우 공유 lock이 반환될 때까지 대기하다가 배타 lock으로 잠글 수 있다. 

 

배타 lock의 목적은 데이터 변경 동안 다른 세션들이 읽지 못하도록 막는 것이다. 

 

 

Intentioni lock

MySQL에서 레코드를 잠글 때 사용하는 방식으로, 기본적으로 데이터를 변경할 때 배타 lock을 사용한다. 

두 세션이 배타 lock을 걸면 먼저 lock을 건 세션 먼저 데이터를 변경하고, 나머지 세션이 lock을 획득한다.

각 세션이 다른 데이터에 대해 배타 lock을 걸면, 범위가 다르기 때문에 동시에 접근 가능하다.

 

명시적인 잠금을 획득해 데이터 읽는 방법

배타 lock을 이용해 데이터 읽기

SELECT * FROM PRODUCT WHERE ID = 1 FOR WRITE;

공유 lock을 이용해 데이터 읽기

SELECT * FROM PRODUCT WHERE ID = 1 FOR SHARE;

lock 없이 데이터 읽기

SELECT * FROM PRODUCT WHERE ID = 1;

 

 

table lock

테이블 전체를 잠그는 것을 table lock이라고 한다. lock을 하는 방법은 명시적인 LOCK TABLE 구문을 이용한다.

# 공유 lock으로 잠금
LOCK TABLE MEMBER READ;

# 배타 lock으로 잠금
LOCK TABLE MEMBER WRITE;

# 잠금 해제
UNLOCK TABLES;

 

 

테이블 배타 lock과 인텐션 배타 lock의 차이

특정 레코드에 인텐션 배타 lock으로 잠긴 데이터는 잠금을 이용하지 않은 SELECT 구문으로도 레코드를 읽을 수 있다.

그러나 테이블 배타 lock은 잠금이 해제될 때까지 어떤 경우라도 데이터를 읽을 수 없다. 

 

 

테이블 lock과 인텐션 lock의 관계

 

 

두 세션에 따른 lock 정리 표

 

lock wait timeout

작금으로 인해 특정 세션이 기다리는 시간을 제한할 수 있다. 

 

 

참고 : https://www.codelatte.io/courses/database_basic/FBNZMUAEDEKRU9WA