티스토리 뷰

오늘은 Lock에 대해 간단히 정리해보고자 한다. 그리고 H2 데이터베이스에서 LOCK을 설정하는 방법과 조회구문 등을 정리하겠다.(MySQL 추가) 

 

Lock일 뭘까?

Lock이란 말그대로 잠그는것으로 데이터의 무결성, 일관성 그리고 동시성을 보장하기 위한 매커니즘이다. 

락은 여러 사용자 또는 프로세스가 동시에 DB에 접근하고 변경할 때 발생하라 수 있는 데이터 불일치나 경합 상태를 방지하기 위해 사용된다.

 

Lock의 종류

공유락(Shared Lock 또는 Read Lock)

읽기 연산을 수행할 때 주로 사용되며, 여러 사용자 또는 프로세스가 데이터를 동시에 읽을 수 있다.

 

배타적 락(Exclusive Lock 또는 Write Lock)

쓰기 연산을 수행할 때 사용되며, 데이터를 변경하는 동안 다른 사용자 또는 프로세스의 접근을 차단한다.

 

Lock의 범위

Row-Level

개별 데이터 행에 락을 거는것, 다른 행에 대한 접근은 허용

Page-Level

데이터베이스 페이지(일반적으로 여러 행을 포함)에 락을 거는 것

Table-Level

전체 테이블에 락을 거는 것


그럼 RDB에서 Lock은 어떻게 설정하고 어떻게 확인할까?

(아래의 글은 H2 데이터베이스 기준입니다)

 

Lock 정보 확인하기

SELECT * FROM INFORMATION_SCHEMA.LOCKS;

 

그럼 아래와 같이 Lock 정보를 확인할 수 있다.

Lock 추가하기

SELECT ~ FROM ~ WHERE ~ FOR UPDATE // 베타 락

위의 구문을 통해 SELECT에도 베타락을 걸 수 있다. 그럼 한 세션이 선택된 ROW를 조회할 때 다른 세션의 조회, 수정작업을 막아 동시성과 일관성을 가져올 수 있다. 베타 락이기 때문에 해당 트랜잭션이 종료되거나 커밋되어야 락이 풀린다.

 

(H2 DB에서는 공유 락 설정 문법이 따로 없는 것으로 확인했는데 아니라면 댓글달아주시면 감사하겠습니다)

 

 

H2의 다중 버전 동시성 제어(Multi-Version Concurreny Control)

H2에서는 INSERT와 UPDATE는 공유 락으로 동작한다고 한다.

즉, A 세션이 컬럼을 변경하고 있는데 해당 트랜잭션이 커밋되지 않았다면 B 세션이 이 컬럼의 예전 값을 조회할 수 있다는 것이다.

 

더불어 컬럼을 삭제(DELETE)하거나 테이블을 DROP 할 때는 베타 락으로 동작된다고 한다.

더보기

Multi-Version Concurrency Control (MVCC)

Insert and update operations only issue a shared lock on the table. An exclusive lock is still used when adding or removing columns or when dropping the table. Connections only 'see' committed data, and own changes. That means, if connection A updates a row but doesn't commit this change yet, connection B will see the old value. Only when the change is committed, the new value is visible by other connections (read committed). If multiple connections concurrently try to lock or update the same row, the database waits until it can apply the change, but at most until the lock timeout expires.

 

http://www.h2database.com/html/advanced.html

 

Advanced

  Advanced Result Sets Large Objects Linked Tables Spatial Features Recursive Queries Updatable Views Transaction Isolation Multi-Version Concurrency Control (MVCC) Clustering / High Availability Two Phase Commit Compatibility Keywords / Reserved Words St

www.h2database.com

 

(추가) - MySQL에서의 공유 락, 베타 락

MySQL에서 Lock 정보 확인

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

MySQL에서의 공유락 설정

SELECT ~ FROM ~ WHERE ~ LOCK IN SHARE MODE # 5.7 버전
SELECT ~ FROM ~ WHERE ~ FOR SHARE # 8.0 버전

공유락은 다른 세션의 수정작업은 막지만 조회작업의 접근은 허용을 한다.

MySQL에서의 베타락 설정

SELECT ~ FROM ~ WHERE ~ FOR UPDATE

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함