양립성 함수 (Lock Compatibility Function)
양립성 함수는 데이터베이스에서 서로 다른 종류의 락(lock)이 동시에 동일한 데이터 항목에 적용될 수 있는지를 판단하는 함수입니다12. 이 함수는 동시성 제어에서 핵심적인 역할을 담당합니다.
락의 종류와 양립성 규칙
데이터베이스에서 사용되는 주요 락 종류는 다음과 같습니다12:
- 공유 락(Shared Lock, S): 읽기 연산을 위한 락으로, 다른 공유 락과는 양립 가능하지만 배타 락과는 양립 불가능합니다
- 배타 락(Exclusive Lock, X): 쓰기 연산을 위한 락으로, 다른 모든 락과 양립 불가능합니다
- 공유 락은 다른 공유 락과 동시에 수락될 수 있습니다
- 배타 락은 다른 어떤 락과도 동시에 수락될 수 없습니다
- 배타 락의 요청은 공유 락이 반납될 때까지 대기해야 합니다
2단계 락킹 규약 (Two-Phase Locking Protocol, 2PL)
2단계 락킹 규약은 데이터베이스에서 직렬성을 보장하기 위한 동시성 제어 방법입니다34. 이 규약은 트랜잭션의 락 획득과 반납을 두 단계로 나누어 관리합니다.
2PL의 두 단계
- 트랜잭션은 새로운 락 연산만 실행 가능합니다
- 락을 추가로 요청할 수 있지만, 반납(unlock) 연산은 실행할 수 없습니다
- 트랜잭션은 락 반납 연산만 실행 가능합니다
- 일단 락을 반납하기 시작하면 더 이상 새로운 락을 요청할 수 없습니다
2PL의 특징
- 직렬 가능성을 보장하는 규약입니다34
- 모든 트랜잭션이 이 규약을 따라야 합니다3
- 락을 일찍 반납하면 일관성이 훼손되고, 늦게 반납하면 교착상태가 발생할 수 있는 문제를 해결합니다1
토마스 기록 규칙 (Thomas Write Rule)
토마스 기록 규칙은 타임스탬프 기반 동시성 제어 규약에서 불필요한 롤백을 줄이기 위해 제안된 규칙입니다56.
기본 타임스탬프 순서 규약
타임스탬프 순서 기법에서는 각 트랜잭션에 고유한 타임스탬프를 부여하여 실행 순서를 결정합니다56. 기본 규칙은 다음과 같습니다:
- 트랜잭션 Ti가 write(x)를 수행하려 할 때, TS(Ti) ≥ read_TS(x)이고 TS(Ti) ≥ write_TS(x)이면 쓰기를 허용합니다5
- 그렇지 않으면 트랜잭션을 취소하고 롤백합니다5
토마스 기록 규칙의 개선점
토마스 기록 규칙은 다음과 같이 개선합니다5:
- TS(Ti) < read_TS(x)이면: 쓰기를 거부하고 트랜잭션을 롤백합니다
- TS(Ti) < write_TS(x)이면: 쓰기 연산을 무시하되 트랜잭션은 계속 진행합니다 (롤백하지 않음)
- 그 외의 경우: 쓰기를 허용하고 write_TS(x)를 갱신합니다
이 규칙의 핵심은 오래된 쓰기 연산을 무시함으로써 불필요한 롤백을 줄이고 시스템 성능을 개선하는 것입니다5.
교착상태 (Deadlock)
교착상태는 특정 트랜잭션 집합 내의 모든 트랜잭션이 집합 내의 다른 트랜잭션을 무한정 기다리고 있는 상태를 의미합니다17.
교착상태 발생 원리
- 두 개 이상의 트랜잭션이 서로의 락을 기다리는 순환 대기 상황
- 예: T1이 데이터 A를 락하고 B를 요청하는 동시에, T2가 데이터 B를 락하고 A를 요청하는 경우
교착상태 해결 방법
1. 예방 기법7
- 각 트랜잭션이 실행되기 전에 필요한 모든 자원을 미리 락합니다
- SET LOCK_TIMEOUT을 통해 일정 시간 후 쿼리를 취소합니다
2. 회피 기법7
- Wait-Die 방식: 먼저 들어온 트랜잭션은 대기하고, 나중에 들어온 트랜잭션은 포기합니다
- Wound-Wait 방식: 먼저 들어온 트랜잭션이 나중 트랜잭션의 락을 선점하고, 나중 트랜잭션은 대기합니다
3. 탐지 및 회복7
교착상태 빈도 줄이기
다음과 같은 방법으로 교착상태 발생 빈도를 줄일 수 있습니다7:
- 트랜잭션을 자주 커밋합니다
- 정해진 순서로 테이블에 접근합니다
- 읽기 잠금의 사용을 피합니다
- 적절한 인덱스를 설계합니다
이러한 동시성 제어 기법들은 데이터베이스에서 트랜잭션의 일관성과 격리성을 보장하면서도 동시 실행 성능을 최적화하는 데 핵심적인 역할을 담당합니다.
- https://velog.io/@bienlee/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-13.-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4
- https://soyeondev.tistory.com/296
- https://swingswing.tistory.com/44
- https://ko.wikipedia.org/wiki/2%EB%8B%A8%EA%B3%84_%EB%A1%9C%ED%82%B9
- https://swingswing.tistory.com/45
- https://peimsam.tistory.com/259
- https://jaehoney.tistory.com/162
- https://bioeng.kaist.ac.kr/index.php?mid=main_news_json
- https://android.googlesource.com/platform/libcore/+/22ee1647dea668bb4022586340576a83cc4759bb/test/jdk/sun/nio/cs/OLD/IBM970_OLD.java
- https://www.ibookee.kr/home_api/v1/media/6
- https://blog.naver.com/program114/220685100538?recommendCode=2&recommendTrackingCode=2
- https://untitledtblog.tistory.com/125
- https://velog.io/@busybean3/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%95%A8%EC%88%98-%EC%A2%85%EC%86%8D%EC%84%B1Functional-Dependency
- https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-deadlocks-guide?view=sql-server-ver17
- https://velog.io/@urtimeislimited/4495fvkf
- https://sommda.tistory.com/106
- https://bottlesun.tistory.com/149
- https://www.borntodare.me/ac27e0ac-6b99-40b2-a207-45ac22d0b4f7
- https://health.kr/searchDrug/ajax/ajax_result_drug2.asp?drug_cd=2020041700010
- https://health.kr/searchIngredient/ajax/ajax_sunb_detail.asp?idx=546
- http://m.airportal.go.kr/file/htmlOpen/upload/ebook/GAT/GAT058/files/basic-html/page28.html
- https://www.goesan.go.kr/DATA/ebook/202505/files/basic-html/page2.html
- https://github.com/BiglySoftware/BiglyBT/blob/master/core/src/com/biglybt/internat/MessagesBundle_ko_KR.properties
- https://www.gne.go.kr/ebook/GNE202505/files/basic-html/page19.html
- https://m.cafe.daum.net/pass365/J6w6/199?listURI=%2Fpass365%2FJ6w6
- https://learn.microsoft.com/ko-kr/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver17
- https://firststep-de.tistory.com/6
- https://blog.naver.com/webvj/220689523819
답글 남기기