database
낙관적 락 (Optimistic Lock)은 데이터 갱신 시 충돌이 발생했는지 검증하고, 충돌이 없을 때만 갱신을 허용하는 방식을 의미합니다. 따라서 충돌이 많이 일어나지 않는 환경에서 많이 사용되며, 비관적 락보다는 성능이 좋습니다.
낙관적 락은 자원의 경쟁을 낙관적으로 바라봅니다. 따라서 다중 트랜잭션이 동시에 데이터를 수정하지 않는다고 가정합니다. 읽은 시점에서는 상관없지만, 데이터를 수정하는 시점에서는 앞에서 읽은 데이터가 다른 사용자에 의해 변경이 되었는지 검사를 해야합니다.
온라인 쇼핑몰에서 아래의 요구사항이 있다고 가정해 보겠습니다.
- 상품 H의 재고 수 : 10
- 사용자 A와 사용자 B가 동시에 상품 H를 구매
사용 시나리오는 아래와 같습니다.
위 case인 경우에 낙관적 락 사용전과 후를 확인해 보고 낙관적 락에 대한 이해도를 높여 봅시다.
- 사용자 A는 재고를 8( 10 - 2 )로 업데이트 합니다.
- 사용자 B는 재고를 4( 10 - 6 )로 업데이트 합니다.
사용자 B가 마지막 업데이트를 했다고 한다면, 재고는 4로 업데이트 됩니다. 하지만 실제로는 2개가 남아야 합니다. 이는 동시성 문제로 인해 데이터가 불일치하게 됩니다.
낙관적 락 (Optimistic Lock)은 주로 version 필드나 타임스팸프 기반의 필드를 사요하여 동시성 충돌을 확인합니다.
낙관적 락(Optimistic Lock)을 통해 동시성 이슈를 방지하고 데이터 무결성을 유지할 수 있습니다. 이는 데이터 충돌이 빈번하지 않는 시스템에 적합합니다.
데드락(Deadlock)이란, 두 개 이상의 작업이 서로 자원을 점유한 상태에서 상대방의 자원을 기다리며 영원히 진행되지 못하는 상태를 말합니다.
- 스레드 1 : A 정보를 구하고 잠금
- 스레드 2 : B 정보를 구하고 잠금
- 스레드 1 : B 정보를 구할 때 블로킹
- 스레드 2 : A 정보를 구할 때 블로킹
특정 트랜잭션에 처리가 완료되지 않은 데이터를 다른 트랜잭션에서 확인 할 수 있는 현상을 의미합니다. dirty read를 허용하게 되면, 데이터가 나타났다가, 사라졌다가 하는 현상을 초래하기 때문에 정합성 문제가 발생합니다.
하나의 트랜잭션에서 동일한 Select 쿼리를 실행 시 다른 결과가 표출되는 현상으로, 결제와 같은 중요한 데이터를 다룰 시에 큰 문제를 발생 시킬 수 있습니다.
하나의 트랜잭션에서 없던 데이터가 생기는 현상을 말합니다.