🧶 알아야되는 이유!
멀티스레딩 환경에서 0.1 초정도 차이로 인한 동시적인 케이스에서 데이터 불일치 현상 발생 방지를 위하여!
🧦 비관적 잠금
@Lock - JPA에서 제공 (말그대로 충돌을 비관적(자주 발생)으로 보는경우)
ex)
- 주문 등록시 (재고가 1인상태에서 두명이 주문후 재고가 0이 되었으나 둘다 결제되어버리는상황 방지)
- 음식점 자리 결제, 비행기 자리 예약하는 경우 (자리 및 해당시간 충돌 상황 방지)
- 학교 유명교수 수강자리가 10자리인데 500명의 학생이 수강신청을 하는 경우
- 콜라보 한정판 상품이 5개 정도 있는데 1000명의 인원이 구매시도 하는 경우 등
👜 낙관적 잠금
@Version - JPA에서 제공 (말그대로 충돌을 낙관적(잘 안일어남)으로 보는경우)
- 커밋시점에서 버전확인 (비관적보다 성능상 이점)
- 롤백후 에러 (클라이언트 입장에서 재시도 필요)
ex)
- 그룹웨어 기업정보 변경시 (시스템관리자와 기업관리자 정보변경시 변경되었다는걸 인지하고 확인필요)
- 브랜드음식메뉴 가격변경 후 매장메뉴 반영한다음에 가격변경시 (변경되었다는걸 인지하지 못하고 변경 방지)
- 게시글 글 변경시 (Confluence 사용시 경험가능)
🥼 참고
@Transantion 고립단계 지식필요
- Spring Batch에도 동시성 상황 고려를 위해 고립단계 최상 Serializable 기본값