개발을 하면서 생각보다 개념적인 부분을 놓치고 있다는 생각이 많이들었다
사실 누가 자세히 알려주는 것도 아니고 해서 공부해야하는 부분이다
오늘은 Lock을 뿌셔보고자 책, 블로그를 탐색하며 이해되도록 정리해보았다
데이터베이스 문외한의 데이터베이스 정복기는 계속된다...
🎈 참고블로그
https://sabarada.tistory.com/121
* Lock
Lock이란 트랜잭션 처리의 순차성을 보장하기위한 방법이다.
여기서 트랜잭션이란 독립적으로 처리할 수 있는 최소한의 단위를 의미한다.
Lock은 DBMS마다 구현하는 방식이나 방법이 다르기때문에 DBMS별로 Lock의 개념을 이해하고 있어야한다.
* Lock의 종류
Lock의 종류로는 Shared Lock(공유락), Exclusive Lock(베타락)이 있으며 이는 각각 Read Lock, Write Lock이라고도 불린다.
공유락은 데이터를 읽을 때 사용되는 Lock이다. 여러 사용자가 하나의 데이터를 읽을 수 있는데 이는 공유락끼리만 가능하다.
그래서 공유락이 설정된 데이터에는 베타락을 사용할 수 없다.
베타락은 데이터를 변경하고자 할 때 사용되며 트랜잭션이 완료될 때가지 유지된다.
베타락은 락이 해제될 때까지 다른 트랜잭션(읽기 포함)이 해당 리소스에 접근할 수 없다.
또한 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근할 수 없다.
* Lock의 설정범위(Level)
- 데이터베이스
전체 데이터베이스를 기준으로 Lock을 설정한다.
즉, 1개의 세션만이 DB의 데이터에 접근이 가능하며 일반적으로 잘 사용하지않는다.
DB의 소프트웨어 버전을 업그레이드하거나 DB 업데이트를 진행할 경우 사용된다.
- 파일
데이터베이스 파일을 기준으로 Lock을 설정한다.
여기서 파일이란 테이블, row등과 같은 실제 데이터가 쓰여지는 물리적인 저장소를 의미한다.
이것도 잘 사용되지는 않는다.
- 테이블
테이블을 기준으로 Lock을 설정한다.
이는 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용하다.
DDL(create, alter, drop 등) 구문과 함꼐 사용되며 DDL Lock이라고도 한다.
-페이지와 블럭
파일의 일부인 페이지와 블록을 기준으로 Lock을 설정한다. 잘 사용하지않는다.
-컬럼
컬럼을 기준으로 Lock을 설정한다.
하지만 이 범위는 Lock 설정 및 해제의 리소스가 많이 들기 때문에 잘 사용하지 않는다.
지원하는 DBMS도 많지 않다.
-행
1개의 행을 기준으로 Lock을 설정한다.
DML에 대한 Lock으로 가장 기본으로 사용하는 Lock이다.
* 블로킹(Blocking)
블로킹은 Lock간(베타-베타, 베타-공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 의미한다.
위에 설명했듯이 공유락끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킨다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(commit or rollback)되어야 한다.
뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하다. 이런 경합은 성능에 좋지 않은 영향을 끼쳐서 경합을 최소화해야한다.
* 성능저하 주의사항
1. 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률을 올린다.
2. 처음부터 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야한다.
3. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지않는다.
4. 쿼리가 오랜시간 진행되지 않도록 적절한 튜닝을 진행한다.
* 교착상태(DeadLock)
교착상태는 두 트랜잭션이 각각 Lock을 설정하고 서로의 Lock에 접근하여 값을 얻어오려고 할 때 발생되는 무한대기상태를 의미한다.
교착상태가 발생하면 DBMS가 두 트랜잭션중 하나에 에러를 발생시킴으로써 문제를 해결한다.
교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는것이 중요하다.