여러 트랜잭션이 동시에 같은 데이터에 대한 읽기나 갱신 작업을 할때 데이터의 무결성이 훼손될 수 있다.
ex)
계좌 B 잔액: 0원
트랜잭션 1: A -> B 1000원 입금
트랜잭션 2: ATM에서 B에 1000원 입금
작업완료 후 계좌 B의 잔액은 2000원이 되어야 한다.
그런데 두 트랜잭션이 동시에 실행될 경우
t1 | t2 |
READ(A) A := A - 1000 WRITE(A) READ(B) B := B +1000 WRITE(B) |
READ(B) B := B +1000 WRITE(B) |
두 트랜잭션 모두 B의 잔액이 0원일 때 읽은 후 1000원을 더해서 데이터를 갱신하고 있다.
그래서 B의 잔액이 2000원이 아니라 1000원이 되는 상황이 발생한다.
동시성 제어
트랜잭션 사이 연산 순서를 제어해서 데이터의 무결성을 유지하면서도 동시 실행하는 트랜잭션의 수를 최대한으로 증가시키기 위한 기법
락 기반 규약은 동시성 제어 기법 중 하나이다.
락 기반 규약
데이터에 연산 적용 전 트랜잭션이 락을 획득하고 연산 종료 후 락을 다시 반납하도록 하는 규약
락의 종류
공유 락(shared lock: S)
읽기 작업만 할 때 사용. 공유 락끼리는 양립 가능.
나 지금 이 데이터 읽을거니까 아무도 갱신하지마 그대신 다른애들이 와서 읽기만 하는건 상관없음.
배타 락(exclusive lock: X)
읽고 쓰기 작업을 할 때 사용. 다른 락과 양립 불가능.
지금 이 데이터 읽고 갱신도 할거니까 작업 끝날때까지 아무도 읽지도 마
분산락
서버가 여러 대인 상황에서 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는것.
서버가 여러대인 경우 여러 서버로 API가 분산 호출 된다.
서버들간에 동기화된 처리가 필요하고, 여러 서버에 공통된 락을 적용해야 하기 위해 사용한다.
분산 락은 db 등 공통된 데이터 저장소를 이용해 자원이 사용중인지 확인하기 때문에 전체 서버에 동기화된 처리가 가능 하다.
교착상태
t1: B -> A 로 1000원 입금
t2: A + B 계좌의 합을 보여줌
트랜잭션들이 작업완료후 락을 반납하는 경우 두 트랜잭션이 동시에 수행되면
t1 | t2 |
LX(B) - B에대한 배타락 획득 READ(B) B := B - 1000 WRITE(B) LX(A) - A에대한 배타락 요청...획득안됨. t1이 A에 공유락을 걸어서.. ... |
LS(A) - A에대한 공유락 획득 READ(A) LS(B) - B에대한 공유락 요청...획득안됨. t1이 B에 배타락을 걸어서 ... |
이렇게 서로 맞물려서 영원히 멈춰있게된다.
이런 상태를 교착상태라고 한다.
교착상태는 한 트랜잭션을 롤백해서 해결할 수 있다. 트랜잭션이 롤백되면 해당 트랜잭션이 갖고있던 락은 모두 반납된다.
참고
https://soyeon207.github.io/db/2021/08/29/distributed-lock.html
'기타' 카테고리의 다른 글
MantisBT | 프로젝트 생성 권한 변경하기 (0) | 2023.01.11 |
---|---|
데이터베이스 | 인덱스란? (0) | 2022.11.10 |
npm install 패키지명 "--save"를 꼭 해야할까 (0) | 2022.09.30 |
ORM(Object–relational mapping) (0) | 2022.09.29 |
In-memory DB | Redis, Memcached (0) | 2022.09.28 |