으어어어어
725
2020-09-11 18:09:06
5
422

NodeJS 동시성에 관련된 질문이 있습니다.


NodeJS을 이용해 개발을 하고 있는데, NodeJS 는 NonBlocking 으로 작동 하기 때문에 동시성에 관련하여 궁금한 점이 생겼습니다.

예를 들어, 호텔에 방을 예약하는 시스템이 있습니다. 아래와 같은 시나리오가 발생할 수 있을까요?


1. 우연히 A와 B가 동시에 같은 시간에 같은 방을 예약 요청한다.


2. NodeJS는 싱글쓰레드 이벤트 루프로 작동함으로 먼저 들어온 A의 요청이 먼저 처리된다.


3. A의 요청에서 요청한 방이 이미 예약이 되어 있는지 확인 하기 위해 SELECT 명령을 수행한다.


4. NodeJS는 Non Blokcing으로 동작하기 때문에 위의 SELECT 쿼리 결과가 응답 될 때까지 B의 요청을 처리 하기 시작한다.


5. B의 요청에서 요청한 방이 이미 예약 되어 있는지 확인 하기 위해 SELECT 명령을 수행한다.


6. 위와 마찬가지로 SELECT 쿼리 결과가 응답 될 떄 까지 다른 요청을 처리한다.


7. A 에서 SELECT 한 요청의 결과가 응답 되어 예약이 되어 있지 않은 것이 확인된다.


8. A의 예약을 INSERT 한다.


9. B 에서 SELECT 한 요청의 결과가 응답 되지만, 위의 INSERT 이전에 SELECT를 수행하여, 이 역시 예약이 되어 있지 않은 상태로 확인된다.


10. B 역시 예약을 INSERT 한다.


11. 동시 예약이 되었다.


위의 시나리오가 발생할 가능성이 있을까요? 없다면 그 이유와 그것에 관련된 검색 키워드를 알려주시면 감사하겠습니다.

0
  • 답변 5

  • 엡실론
    3k
    2020-09-11 18:14:40

    트랜잭션을 안 쓰면 가능합니다.

  • 바나코
    518
    2020-09-11 18:22:19

    트랜잭션으로 만드셧다면 동시성이 제어되어 일어나지 않을것이라 생각합니다ㅎㅎ

  • 으어어어어
    725
    2020-09-11 18:24:55

    엡실론


    답변 감사합니다.

    트랜잭션이라는게 데이터베이스의 트랜잭션으로 이해를 했는데 맞는건가요?

    제가 자바만 하다 와서 잘 모르겠지만 자바에서는 트랜잭션을 사용해도 위와 같은 상황이 발생하는 경우를 봤었습니다. NodeJS는 트랜잭션으로 안전하게 처리가 가능한가요?

  • kimpugie
    2020-09-11 19:42:41

    nodejs가 concurrency를 싱글스레드기반의 이벤트 루프로 다르는것과 제시한 문제와는 상관관계가 없어보입니다.

    트랜잭션은 RDBMS의 키워드이니 디비쪽을 더 찾아보서야 될거같은데요. isolation level이나 위쪽에 언급된 transaction등의 개념들을 공부하시고 적용하시는게 좋을것같습니다.

    데드락같은 키워드도 같이 보시면 좋을것같네요.

    nodejs는 트랜잭션을 처리하는 기본적인 기능은 없습니다. 프로그래밍으로 구현하면 모를까요.



  • 엡실론
    3k
    2020-09-11 19:48:57

    // 으어어어어

    네 데이터베이스 트랜잭션이 맞습니다.

    트랜잭션에는 Isolation level이라는게 있는데 아마 그걸 잘못 사용하셔서 문제가 발생하지 않았나 생각합니다. 노드도 마찬가지로 잘못쓰면 동일하게 문제가 발생합니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.