1.Lock 이란?
- 데이터 베이스에서 동시성 제어를 할 때 사용하는 기술
- 많게는 수천 명의 사용자(트랜잭션)가 액세스 하는 애플리케이션 환경에서 여러 요청을 동시에 처리 하기 위해 사용
* Transcation - 나누어지지 않는 최소한의 데이터 베이스 처리 단위 - SELECT, INSERT, UPDATE, DELETE 등과 같은 조작어를 사용하는 행동 |
왜 사용할까 ?
- 어떤 프로세스가 먼저 해당 자원을 수정할지 확실하지 않기 때문에 예측 불가능한 결과 발생 가능
- 데드락 발생 가능
* 데드락 - 두개 이상의 프로세스가 서로 가진 자원을 대기하면서 무한정 대기되는 상황 - SQL Server에서는 일반적으로 데드락 발생 시 가장 손해가 적은 트랙잭션을 실행하는 스레드를 희생자로 선택 |
- 여러 프로세스가 동시에 자원을 수정하면, 데이터가 일관성 없이 변할 수 있음
- 시스템의 성능 저하
- 예상치 못한 순서로 작업이 수행될 수 있음
-> 따라서, 이러한 문제들을 해결하기 위해 프로세스나 스레드 간에 안전하게 자원을 공유하고 동기화 하는 것이 필요하고 Lock 메커니즘이 이것을 가능하게 한다.
2.Lock Type
Exclusive Lock (배타적 잠금) | Shared Lock (공유 잠금) | |
별칭 | Wirte Lock | Read Lock |
설명 | 행이나 테이블을 완전히 잠그고 트랙잭션이 행을 UPDATE, DELECT, INSERT 할 수 있도록 함 이 때 다른 트랙잭션은 잠금이 해제 될 때 까지 리소스에 접근을 할 수 없게 되며 기다리게 된다 |
트랜잭션이 잠겨있는 행이나 테이블을 읽어올 수 있으나 리소스 업데이트 작업을 할 수 없는 잠금. 공유 잠금 끼리는 동시 접근 가능 |
설정 방법 | MSSQL에서는 기본적으로 트랜잭션이 완료 될 때 까지 데이터의 일관성을 보장하기 위해 수정 중인 데이터에 대해 배타적 잠금을 설정 | SELECT 문에 의해 설정 |
해제 방법 | 잠금을 걸어 놓은 트랜잭션에서의 ROLLBACK 혹은 COMMIT | 잠금을 걸어 놓은 트랜잭션에서의 ROLLBACK 혹은 COMMIT |
예시 | 한 번에 한명의 친구만 놀이터에 들어갈 수 있다. A가 놀이터에 들어가면 그 동안에 다른 친구들은 놀이터에 들어갈 수 없는 것. |
도서관에서 여러 친구들이 같은 책을 함께 읽는 것. 그러나 한 친구가 책을 수정하거나 바꾸면 안됨. 그냥 읽기 만 해야함 |
요약 | 하나의 자원을 한 번에 하나의 프로세스만 사용할 수 있게 | 여러 프로세스가 자원을 동시에 사용할 수 있게 하지만, 동시에 수정은 못하게 하는 것 |
* COMMIT - 데이터베이스 트랜잭션에서의 변경 사항을 확정하고, 영구적으로 적용하는 작업. ex. 계좌에서 돈을 이체하는 작업이 모두 완료되면, COMMIT을 통해 이 변경 사항이 확정되고 계좌 잔액이 업데이트 |
* ROLLBACK - 트랜잭션에서의 변경 사항을 취소하고, 이전의 상태로 되돌리는 작업. 트랜잭션이 중간에 오류가 발생하거나 사용자가 트랜잭션을 취소하고자 할 때 주로 사용되며, 롤백 사용 시 데이터 베이스는 이전의 일관된 상태로 돌아감 ex.DB에서 고객 정보를 업데이트하려는 트랜잭션이 중간에 오류가 발생하면, 롤백을 사용하여 해당 트랜잭션의 모든 변경 사항을 취소하고 이전의 고객 정보 상태로 복구할 수 있음 |
이렇게 LOCK 을 통해, 여러 트랜잭션이 동시에 접근하지 못하게 할 수 있다.
하지만 트랙잭션 자체 격리를 통해서 특정 트랙잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정해 줄 수도 있다. 이게 바로 트랜잭션 격리인데, 격리 수준을 설정해 줄 수 있다. 즉, 락은 특정 자원에 대한 동시 접근을 제어하고 트랜잭션 격리는 트랜잭션 간의 격리 수준을 정의하여 일관성을 유지하는 것!
3.트랜잭션 격리 수준 (isolation Level)
READ UNCOMMITTED | READ COMMITED | REPEATABLE READ | SERIALIZABLE | |
격리 수준 | 1단계 | 2단계 | 3단계 | 4단계 |
설명 | 다른 작업이 아직 완전히 끝나지 않은 데이터를 읽을 수 있음 | 다른 작업이 완전히 끝난 후에만 해당 작업의 결과를 읽을 수 있음 | 한 번에 여러 번 같은 작업을 반복할 수 있음. 다른 작업이 결과를 바꾸지 않는다 | 여러 작업이 동시에 일어나도 순차적으로 일어나는 것처럼 격리 |
부작용 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 저하 유발 |
사용 예시 | 은행 계좌 잔액 조회 시 다른 트랜잭션이 아직 커밋하지 않은 입금 내역을 조회하려고 할 때 |
* Dirty Read (더티 리드) - 하나의 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 현상 ex.친구 A가 은행에서 돈을 입금하고 있는데, 친구 B가 아직 A의 입금이 커밋되지 않은 상태에서 A의 잔액 조회 |
* Non-Repeatable Read (비반복 가능한 리드) - 동일한 쿼리를 두 번 실행했을 때, 첫 번째와 두번째 결과가 다른 현상 의미 (데이터의 변경을 다룸) ex.온라인 쇼핑몰에서 처음 상품 가격 조회시 시와 두번째 가격 조회 시 가격이 변경되는 경우 |
* Phantom Read (팬텀 리드) - 동일한 쿼리를 두 번 실행했을 때, 첫 번째와 두 번째 결과 사이에 다른 트랜잭션에 의해 새로운 데이터가 추가 (데이터의 추가를 다룸) ex.도서관에서 특정 카테고리의 책을 조회했을 때 첫 번째 조회에는 없던 다른 작가의 새로운 책이 나타남 |
'데이터베이스 > 데이터베이스' 카테고리의 다른 글
[RDB] DB별 포트 번호 (0) | 2024.08.07 |
---|---|
[SSMS] SQL Server Management Studio 에서 CSV로 테이블 만들기 (0) | 2024.07.01 |
[ SQL Server] SQL Server Agent를 이용해 Daily Job을 생성해보자 (0) | 2023.12.12 |
[Bigquery] GCS를 활용한 대용량 쿼리 데이터 다운로드 (0) | 2023.11.28 |
[Bigquery] 파티션 테이블 (Partition Table) (0) | 2023.08.31 |
댓글