상호배제(Mutual exclusion)
: 자원은 한 프로세스에 의해서만 점유가능점유대기(Hold and wait)
: 최소한 하나의 자원을 점유한 상태에서, 다른 프로세스가 점유한 자원을 기다리는 프로세스가 존재해야함비선점(No preemption)
: 다른 프로세스가 점유한 자원은 강제로 빼앗을 수 없음순환대기(Circular wait)
: 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음→ 위 조건들을 모두 만족해야 발생하며, 이들은 완전 독립적인 조건은 아니다. 순환대기=점유대기+비선점
→ 교착상태의 필요조건 하나를 제거함으로서 해결. 자원 사용의 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.
안전상태(Safe state)
: 데드락을 발생시키지 않으면서 모든 프로세스를 처리하는 상태
안전순서(Safe sequence)
: 데드락이 발생하지 않는 프로세스 순서를 찾을 수 있는 상태
→ 이 역시 성능에 큰영향을 줄 수 있다.
무결성
에서 낙관적락 보다 우수하나, 교착상태
가 발생할 수 있다.version = version+1
, {colums...} where version = read시 가져온 버전
and {condition...}DeadLock을 줄이기 위해서는 다음과 같은 방법들이 있다.
1) 인덱스를 설정한다. 인덱스가 없으면 Lock이 걸리는 범위가 훨씬 넓어지기 때문에 교착상태가 발생하기 쉬워진다.
2) 자원들을 한쪽으로 사용한다. A와 B라는 테이블이 있다면 모든 세션에서 A->B 순서로 사용하도록 한다.
3) 트랜잭션은 가급적이면 짧게 만든다.
4) 테이블의 크기를 작게 쪼갠다. (정규화)
5) Transaction Isolation Level을 "Read Uncommitted"로 설정한다.
Reference
- https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C
- https://jinhanchoi1.medium.com/%EB%B9%84%EA%B4%80%EC%A0%81-lock-%EB%82%99%EA%B4%80%EC%A0%81-lock-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1986a399a54
- https://jinhokwon.github.io/mysql/mysql-select-for-update/
- https://github.com/jobhope/TechnicalNote/blob/master/database/OptimisticLockAndPessimisticLock.md