만약 수정중에 누군가가 읽으면?
내가 하는 동안 아무도 못 건드려!
Lock : 동시성 제어
Transaction : All or Nothing
결론 : 각 트랜젝션들을 어떻게 처리할지 구현 방법 중 1가지 -> Lock
따라서 Lock이 Transaction에 포함됨
낙관적 Lock : 애초에 트랜젝션이 부딪히지 않는다. 따라서 트랜잭션이 부딪히면 그 때 조치를 취함
비관적 Lock : 애초에 트랜젝션이 계속해서 부딪힘
쿠폰5장 사람20명 - 쿠폰 발급받기
결과 : 20장 쿠폰 발급
결과 : 쿠폰발급 3장 / 낙관적 Lock 획득 실패 횟수 17번
why : JPA에서는 최초의 커밋만 인정
하기 때문에 JVM이 어떻게 되느냐에 따라서 발급되는 쿠폰이 달라짐 (1장..2장..3장..최대 5장까지만)
버전 변경
낙관적 Lock을 얻을 수 없다. 따라서 Count X
결론 : 낙관적 Lock은 최초의 커밋이 발생한다. 이때 JVM이 어떻게 되느냐에 따라서 발급되는 쿠폰이 달라진다. 고정적인데 아니다.
결과 : 쿠폰발급 5장 / 갯수 부족 횟수 = 15
why : 동시에 Transaction이 발동해도 먼저 들어간 Transaction만 발동하고 Lock이 걸리기 때문에
Transaction이 DB에 접근할 때부터 Lock을 걸어버리는 쿼리
비관적 Lock은 DB에 접근할 때부터 Lock을 걸어버리지만 낙관적 Lock은 DB에 접근할 때는 Lock하지 않고 처음 순서대로 커밋을 하고 처음 commit과 다르면 Transaction을 하지 않는다.