작성
·
288
0
안녕하세요, 강의 잘 듣고 있습니다. 지금까지 발생한 질문들에 대해서 문의드리려 합니다.
Transactional 을 주석처리해도 해당 StockService 와 Repository 인터페이스가 잘 동작하는 모습을 확인할 수 있습니다. (듣다가도 당연히 오류날줄 알았습니다)Data Jpa 를 활요하지 않고 일반적인 Jpa Repository 를 직접 만들어서 (em을 사용하는) 시도를 해봤는데 Transactional 이 없으니 예상했던 오류가 그대로 발생하는 것 같았습니다. JpaRepository 인터페이스에 들어가보니, @NoRepositoryBean 이라는 어노테이션만이 붙어 있고, 그냥 다른 Repo를 만들지 못하도록 달아져 있는 것이라는 것을 확인하였습니다. 작동하는 이유가 Data Jpa 가 제공해주는 Repository interface 를 사용해서 인 것 같은데, 어떤 원리로 작동이 가능한건지 알 수 있을까요?
Synchronize 를 사용해도 우선 동작을 하는 이유는 @Transactional 의 동작 방식 때문이라고 설명해주시며, 예시 클래스를 짜서 보여주셨습니다.
public void decrease(){
startTransaction();
myStockService.decrease();
endTransaction();
}
트랜젝션이란 DB와의 통신을 위해 연결을 짓는 행위로 알고 있는데, DB는 공유 자원인 만큼 당연히 동시성 제어가 되어 있어야 하는 것이 아닌가 생각이 들었습니다. 가령, 위에서 startTx, endTx 를 하는 부분에서 세마포어 처리 등을 해서 교착상태가 발생하지 않도록 설계가 되어 있어야 하지 않나 싶은 생각이 들었는데, @Transactional 에서 그런 것을 처리 하지 않아서 이와 같은 상황이 발생하는게 맞을까요? (강사님한테 문의드리는게 좀 이상한 부분일 수도 있지만, 왜 그런 처리를 안해놨을지 궁금.. 합니다)
감사합니다.
답변 1
0
강우석님 안녕하세요.
1번 질문에 대해서는 이해하지 못했습니다.
댓글을 통해 조금만 추가적인 설명을 해주시면 다시 보도록 하겠습니다.
2번 질문에 대한 답은 아래와 같습니다.
일단 트랜잭션은 DB 와의 통신을 위해 연결짓는 행위가 아닙니다.
말씀하신대로 DB 는 공유자원이기때문에 트랜잭션을 통해 데이터정합성을 보장합니다.
셋째로 Jpa 를 사용하기 때문에 (정확히는 update stock set quentity = 3 과 같은 쿼리) 를 사용하기때문에 동시성 문제가 발생합니다.
update stock set quantity = quantity - 1 과 같은 쿼리를 사용하게 된다면 동시성문제는 해결될 것입니다.
추가적인 질문이 있으시다면 댓글 부탁드리겠습니다!
감사합니다 :)