블로그는 나의 힘!
[ Programing ]/Interview2021. 12. 16. 16:21

MS-SQL DB 쿼리 내 락
- 테이블 조회 시 행렬은 일시적으로 락이 걸리고 트랜잭션(작업 단위)이 끝날 때 까지 데이터 수정이 불가.
- 무효화. 연산 처리 중 오류 발생 시 트랜잭션은 중단되고 처음 상태로 대기.

락 문제
메인 스레드 외 백그라운드 스레드에서 사용하다 스레드 간 락 잡는 시점이 겹치면 문제 발생.

DB 발생 원인
Create, Update, Delete 를 하면 배타 락 잡힘.
C.U.D. 에서 쓰기를 한꺼번에 하는 트랜잭션 발생 시 배타 락을 오래 잡는다.

락 상태

Unlocked  읽기와 쓰기가 안되는 기본 상태.
Shared 읽기만 가능.
다른 스레드에서 동시 공유 락 가능.

단, 쓰기는 불가. 쓰기 위해서는 모든 공유 락이 해제될 때 까지 대기 필요.
Reserverd  쓰기 예약.
예약 락은 하나만 존재. 여러 공유 락과 같이 사용 가능.
Pending  쓰기 예약 하되 최대한 빨리 쓰기.
새로운 공유 락 허용 불가.
Exclusive 파일 쓰기.
다른 락과 같이 있을 수 없고 하나의 락만 허용.

배타 락 가진다면 다른 작업 불가능해 배타 락에서 작업을 최소화 필요.





※ 쿼리 락이 되었다면. (언락 X)
타 유저가 DB를 선점해 사용 중 이거나, 정상적으로 종료 되지 않아 나타나는 현상.

해결법
SQL> EXEC SP_LOCK   -- 락 컬럼 SPID 조회.
SQL> EXEC DBCC InputBuffer( [SPID] )   -- 락 쿼리 확인 OR EXEC SP_WHO [SPID] 유저 정보 확인.
SQL> KILL [SPID]   -- 강제 종료.

DB Lock 예
- 여러 스레드에서 1개 DB instance만 가지고 쓰기 진행 -> X
- 여러 스레드에서 각각 DB instance를가지고쓰기진행 -> O
- 1개의 스레드에서 1개의 instance를 가지고 계속 쓰기하고, 여러 스레드에서 각각 인스턴스 읽기 진행 -> O
- 여러 스레드에서 각각 인스턴스 읽기만 한다. -> X
- 1개 DB instance를 가지고 쓰기 트랜잭션과 읽기를 동시 진행 -> X



참조 : https://programmingfbf7290.tistory.com/entry/SQLite
https://syujisu.tistory.com/193 

 

[SQL]LOCK이란?

- 정의 : 데이터의 일관성을 보장하기 위한 방법 (= 잠금 / 데이터를 동시에 사용하게 해주는 기능) - 유형 Shared Lock(= 공유 Lock / Read Lock) : 다른 사용자가 같이 읽는 것을 허용하지만 변경하는 것

syujisu.tistory.com




 

Posted by Mister_Q