티스토리 뷰

CS/DB

DB의 Lock

bool-flower 2022. 10. 8. 21:32

Lock이란?

(Lock)이란 데이터베이스에서 데이터에 잠금을 걸어 동시성을 제어하는 방법이다. 여러 사용자가 동시에 데이터베이스에 접근하여 데이터를 변경하는 상황에서 충동을 방지하기 위해 사용된다.

InnoDB의 Lock

MySql 공식 문서에 따르면 InnoDB는 다음과 같은 다양한 종류의 lock을 사용한다. 

 

이 글에서는 다른 DBMS에서도 존재하는 개념인 공유 잠금과 배타 잠금에 대해서만 정리해보겠다.

공유 잠금(Shared lock, S lock)

읽기에 대한 잠금이다. 어떤 트랜잭션에서 데이터를 읽고자 할 때 사용된다. 공유 잠금이 걸린 데이터에 다른 트랜잭션이 읽기를 시도하여 데이터를 읽을 수 있다.

배타 잠금(Exclusive lock,  X  lock) 

쓰기에 대한 잠금이다. 데이터를 변경하고자 할 때 사용되며, 배타 잠금이 걸린 데이터에는 다른 트랜잭션이 접근할 수 없게 된다. 

 

정리하면, 두 잠금 사이의 규칙은 다음과 같다.

 

  • 여러 트랜잭션이 동시에 한 row에 공유 잠금을 걸 수 있다. 즉, 여러 트랜잭션이 동시에 한 row를 읽을 수 있다.
  • 공유 잠금이 걸려있는 row에 다른 트랜잭션이 배타 잠금을 걸 수 없다. 즉, 다른 트랜잭션이 읽고 있는 row를 수정하거나 삭제할 수 없다.
  • 배타 잠금이 걸려있는 row에는 다른 트랜잭션이 공유 잠금과 배타 잠금 둘 다 걸 수 없다. 즉, 다른 트랜잭션이 수정하거나 삭제하고 있는 row는 읽기, 수정, 삭제가 전부 불가능하다.

요약하면, 공유 잠금을 사용하는 쿼리끼리는 같은 row에 접근 가능하다. 반면, 배타 잠금이 걸린 row는 다른 어떠한 쿼리도 접근 불가능하다.

Lock의 설정 범위

데이터 베이스

  • 전체 데이터베이스를 기준으로 잠금을 거는 것.
  • 1개의 세션만이 DB 데이터에 접근이 가능하다.
  • 평소에 잘 사용되지 않고, DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용.

파일

  • 데이터베이스 파일은 테이블, row 등과 같은 실제 데이터가 쓰이는 물리적인 저장소를 말함.
  • 데이터베이스 파일을 기준으로 lock을 설정.

테이블

  • 테이블을 기준으로 Lock 설정.
  • 테이블의 모든 행을 업데이트하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 사용.
  • DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 함.

페이지

  • 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정.

컬럼

  • 컬럼 기준으로 Lock을 설정.
  • Lock 설정 및 해제의 리소스가 많이 듬.

  • 1개의 행(Row)을 기준으로 Lock 설정.
  • DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock.

참조

https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

https://earth-ing.tistory.com/entry/Database-Lock-%EC%B4%9D%EC%A0%95%EB%A6%AC

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

데이터베이스 인덱스  (0) 2022.10.28
데이터베이스 커넥션 풀, DBCP(DataBase Connection Pool)  (0) 2022.10.27
트랜잭션 (Transaction)  (0) 2022.10.08
MySQL 아키텍처  (0) 2022.08.04
조인 수행 원리  (0) 2022.08.02
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday