트랜잭션 A, B가 있을 때 두 트랜잭션이 같은 로우를 변경하는 것을 방지함
- 한 로우를 변경하고자 할 때, 프로세스는 ‘로우Lock’을 먼저 설정한 뒤 변경할 수 있다
- 항상 배타적모드 (모든 DBMS가 해당됨)
Update, Delete에 대한 ‘로우Lock’
- 트랜잭션 A가 로우를
update / delete 하는 중에는
- 트랜잭션 A가 로우Lock을 걸어잠그고 로우에 수정/변경을 가하기 때문에
- 트랜잭션 B에서 로우를
update / delete 하는 것이 불가능하다.
- 트랜잭션 A가 로우Lock을 해제할 때까지 트래잭션B는 대기한다. (경합발생)
- 트랜잭션 A가
commit rollback 할 때 로우Lock이 해제됨
Insert에 대한 ‘로우Lock’
- Unique인덱스 (Unique제약조건)가 없을 때
- 로우Lock으로 인한 다른 트랜잭션의 대기가 없다
- Unique인덱스 (Unique제약조건) 있을 때
- 아주 짧은 시간 간격에 (거의 동시라고 할 수 있을 정도로) 트랜잭션 A, B순으로 값 ‘가’를 INSERT하려고 하면 트랜잭션B는 대기한다. (경합발생)
SELECT에 대한 ‘로우Lock’
- 로우Lock이 안 걸려있는 로우를 SELECT하고자 할 때
- 로우Lock을 걸지 않고 SELECT 읽기한다.
- 로우Lock이 걸려있는 로우를 SELECT하고자 할 때
- 트랜잭션A가 Lock을 걸고 로우에 변경(임시적)을 가한 상태에서는
- 트랜잭션B가 CR Copy본으로 SELECT할 수 있다
- 결론, DML과 SELECT는 서로 진행을 방해하지 X
로우Lock 튜닝포인트
- 로우Lock을 오랜 시간 유지하게 만드는 트랜잭션은 야간에 진행할 것 (커밋시점 조절)
- SQL튜닝을 통해 로우Lock이 오래 지속되지 않도록 한다