1 Silent Data Loss
- 먼저 Lock에 대해 알아보기 전에 Lock으로 해결할 수 있는 Silent Data Loss 문제에 대해 알아보자
- Second Lost Update Problem라고 불리기도 한다.
- Silent Data Loss는 데이터베이스 트랙잭션 범위를 넘어서는 문제이다.
- Optimistic Locking과 Pessimistic Locking을 통해 Silent Data Loss 문제를 해결할 수 있다.
- 두 가지의 케이스를 보면서 Silent Data Loss 문제가 무엇이고 어떻게 발생하는지 알아보자.
1.1 Case1: Concurrent Database Transactions Problem

- Transaction 1과 Transaction 2가 같은 상태의 아이템을 읽는다
- 두 트랜잭션이 한 아이템에 대해서 다른 수정작업을 한다
- Transaction 1은 아아템의 amount를 5 증가시킨다
- Transaction 2은 아아템의 amount를 10 증가시킨다
- Transaction 2가 먼저 커밋하고 수정 사항을 데이터베이스에 영속화한다
- 잠시 뒤 Transaction 1이 커밋하면서 Transaction 2의 수정사항을 덮어쓴다
- 아이템의 amount 15가 되는 것을 기대했지만 최종적으로 Transaction 2의 수정사항이 없어져 amount가 5가 되었다
- 이러한 문제를 Silent Data Loss 또는 Second Lost Update Problem이라고 한다
1.2 Case2: Concurrent Long Conversations Problem

- 두 명의 사용자가 똑같은 아이템을 수정하고 있다([SAVE] 버튼이 있는 GUI 폼을 통해서)
- 두 명의 유저 모두 같은 상태의 아이템을 가지고 있다
- 유저 1은 Transaction1을 통해 아이템을 가져온다
- 유저 2은 Transaction2을 통해 아이템을 가져온다
- Transaction1과 Transaction2가 종료된 상태에서 수정 작업을 진행한다
- 즉 수정 작업은 트랜잭션 밖에서 진행된다
- 트랜잭션을 계속 유지한다면 성능상 좋지 않기 때문
- 유저2가 SAVE 버튼을 눌러 수정을 완료하면 유저2의 수정 사항이 Transaction3을 통해 데이터베이스의 영속화된다
- 잠시 뒤 유저1이 SAVE 버튼을 눌러 수정을 완료하면 Transaction4를 통해 유저 2의 수정 사항을 덮어쓴다
- 아이템의 amount 15가 되는 것을 기대했지만 최종적으로 유저 2의 수정사항이 없어져 amount가 5가 되었다
- 이러한 문제를 Silent Data Loss 또는 Second Lost Update Problem이라고 한다
1.3 Silent Data Loss 해결책
- 해결책으로 3가지 선택 방법이 있다
- 마지막 커밋민 인정
- 최초 커밋만 인정
- 충돌하는 갱신 내용 병합
- JPA가 제공하는 버전 관리 기능을 사용하면 손쉽게 최초 커밋만 인정하기를 구현할 수 있다
2 Optimistic Locking