동시성 문제란
•
DBMS는 서버로 운용되고, 여러 사람이 동시에 접근해서 사용한다.
여러 사람이 동시에 접근해서 데이터를 사용하는데, 여러 사람이 동시에 데이터를 수정한다면, 서로 간섭이 일어나서 오류를 범할 수 있다.
따라서, 데이터 수정이나 읽기 권한을 통제하기 위해 만들어진 것이 LOCK 이다.
즉, LOCK이란 데이터를 수정하거나 읽는 권한을 특정 사람에게 부여해서, 그 권한을 다른 사람에게 넘겨주기 전까지 다른 사람이 데이터를 수정하거나 읽는 것을 막는 것
LOCK
1.
명시적인 LOCK
•
SELECT ... FOR WRITE : 배타 락 (Exclusive Lock), 데이터를 수정할 수 있는 권한, 다른 사람은 락이 해제되어야 데이터 접근 가능
•
SELECT ... FOR SHARE : 공유 락 (Shared Lock), 데이터를 읽을 수 있는 권한, 다른 사람도 읽는 것은 가능
•
LOCK TABLE ... : 테이블에 락을 거는 것, 락이 걸린 테이블에는 권한 통제가 생긴다.
2.
묵시적인 LOCK
•
명시적으로 잠금 설정을 안해도, 논리상 DBMS에서 자동으로 잠금 처리 되는 것
•
> 데이터를 변경하는 구문인 UPDATE 구문이 사용되면, 묵시적으로 배타 락(Write Lock)이 걸리며, 락을 먼저 획득한 세션이 잠금을 해제해야 다른 사용자들이 사용할 수 있다.
3.
Read Lock(Shared Lock)
•
데이터에 Read Lock이 걸리면, 데이터를 읽는 것은 가능하지만 수정할 수 없고 잠금이 해제되었을 때 데이터를 수정할 수 있다.
4.
Write Lock(Exclusive Lock)
•
데이터에 Write Lock이 걸리면, Write Lock이 걸린 데이터에 한 세션만 접근할 수 있고, 다른 세션은 배제한다. 잠금을 건 세션만 데이터를 읽고 수정할 수 있으며, 다른 세션은 잠금이 해제될 때까지 기다려야 한다.
5.
Table Lock
•
테이블 전체 레코드에 거는 락
6.
Record Lock (Intention Lock)
•
레코드를 범위로 잠금을 거는 락. 부분적으로 잠금을 걸기 때문에 잠금의 범위를 최소화 하여 잠금으로 인한 문제를 줄여준다.
위와 같이 서로 다른 레코드에 락을 걸어놨으므로, 서로 간섭하지 않기 때문에 대기 시간 없이 데이터를 변경할 수 있다.
위 그림과 같이, Shared Lock이 걸리면 다른 사용자도 Read 는 가능하지만, Write는 불가능하다.
또한, Exclusive Lock이 걸리면, 다른 사용자들은 Write 뿐만 아니라, Read 도 불가능하다.
락 과정 예시
세션 A가 명시적으로 트랜잭션을 시작하고 공유 락을 걸었다. 그리고 트랜잭션을 커밋하면 잠금이 해제된다.
세션 B는 UPDATE 구문, 즉 묵시적인 배타락을 걸려고 했기 때문에, 먼저 공유락을 건 A의 락이 해제될때까지 기다린다.
세선 C는 공유 락을 사용했기 때문에, 대기 없이 바로 원하는 작업을 수행할 수 있다.
위 경우에는 A가 배타 락을 걸었으므로, 세션 B와 C는 둘다 락이 풀릴때까지 대기해야한다.
순서는 세션 A -> 세션 C -> 세션 B 순으로 이루어 질 것이다.