동시성 문제

Single Ko·2023년 9월 8일
0

공부하며 정리

목록 보기
16/17

동시에 여러 요청이 들어올 시? : 요청이 정확하게 반영되지 않는다.

여러 사람이 database에 접근해서 데이터를 수정할 시 동시에 접근해 수정이 일어나 충돌이 일어날 수 있습니다

synchoronized

자바에서 제공하는 synchoronized 키워드를 메서드에 입력해서 처리 가능. 다만 성능도 떨어지고 프록시 객체를 사용하는 경우 문제 발생 여지가 있음. 가장 큰 문제는 synchronized를 붙인다고 해서 동시성 문제를 전부 해결하지 못한다.

비관적 락(Pessimistic Lock)

  • 충돌이 무조건 발생할 것이라는 가정. (비관적)

테이블의 row에 유저가 접근시 Lock을 걸고 다른 유저는 Lock이 걸려 있지 않을 경우에만 수정을 가능하게 하는 것

자체 락으로 정합성 맞춤

Pessimistic Lock 은 공연장 티케팅 할 때 먼저 접속한 사람이 좌석 선택하면 결제를 아직 안했어도 점유 된 걸로 보고 그 후에 접속한 사람한테 옵션 안 띄워주는 거

  • 하나의 트렌젝션으로 묶여있음.
  • 수정이 하나 실패하면 database 단에서 전체 Rollback이 일어 난다.
  • 만약 요청이 도중 요구 사항이 하나 실패한다면 트렌잭션 전체에 rollback이 일어난다.

낙관적 락(Optimistic Lock)

  • 충돌이 거의 없을 것이라는 낙관적인 가정(낙관적)
    수정할 때 내가 먼저 이 값을 수정했다고 명시(version 사용)하여 다른 사람이 동일한 조건으로 값을 수정할 수 없게 하는 것.

버전 정보를 통해 정합성을 맞춤

Optimistic Lock 은 수강신청 할 때 화면 로드 시점에는 인기 수업에 잔여석이 있는 걸로 확인하고 과목 선택해서 수강 신청 버튼을 눌렀는데 이미 다른 사람이 정보를 변경해서 마감되었고, 그것을 클릭하면 알 수 있다.

  • Transaction이 걸려있지 않다.
  • 충돌이 발생하여 수정을 못한 부분에 대해서는 Rollback에 대한 책임을 Application 단에서 진다.
  • 만약 충돌이 났다고 한다면 이를 해결하려면 개발자가 수동으로 Rollback 처리

언제 무엇을 사용하나?

  • 비관적 락(Pessimistic Lock)은 경합 사항이 많이 발생할 것 같은 곳에서 사용
  • 낙관적 락(Optimistic Lock)은 경합 사항이 적은 곳에서 사용.

낙관적 락은 충돌이 많이 예상되거나 충돌이 발생했을 때 비용이 많이 들것이라고 판단되는 곳에서는 사용하지 않는 것이 좋을것으로 보입니다.

profile
공부 정리 블로그

0개의 댓글