inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

재고시스템으로 알아보는 동시성이슈 해결방법

'Synchronized 이용해보기' 강의에서 질문이 있습니다.

286

한지찬

작성한 질문수 9

0

제가 이해한 바는 다음과 같습니다.

 

Transactional 어노테이션을 사용시

 

synchronized를 사용시

 

그런데 1분 29초부터 설명을 들어보면

decrease 함수 안에서,

endTransaction을 수행하기 전에 다른 스레드가 decrease 메소드를 호출할 수 있다고 하셨습니다.

 

그런데 이 부분이 이해가 안됩니다. synchronized 키워드를 붙였다면, 동시에 같은 객체의 메서드를 다른 스레드가 호출하지 못하는것 아닌가요?

 

Transactional 어노테이션을 주석처리하면 동작하던데,

이 여부와 관계 없이 동작해야하는것 아닌가요?

 

java spring 동시성

답변 1

0

최상용

한지찬님 안녕하세요.
Spring 에서는 Transactional 어노테이션을 사용하면 해당 클래스를 래핑하는 클래스를 만들어서 처리합니다.
예를들면 아래와 같은 모습을 띠고있습니다.

class StockServiceWithTransactional {

    StockService stockService;

    public void decrease(Long quantity) {
        transaction.start()
        stockService.decrease(quantity)
        transaction.commit()
    }
}

이때 StockService 의 decrease 메소드에는 synchronized 가 붙어있으므로 메소드에는 1개의 스레드만 접근하는 것이 보장됩니다.
하지만 데이터베이스에 커밋을 하는 동안 다른 스레드가 StockService 의 decrease 메소드에 접근할 수 있게 됩니다.

이러한 이유로 Transactional 을 붙였을 때 문제가 발생하는 것입니다.

감사합니다.

0

한지찬

아아... 하기와 같이 이해하면 될까요!?

  1. stockService.decrease(quantity) 이 메소드는 한번의 하나의 스레드만 접근할 수 있다.

  2. 하나의 스레드가 stockService.decrease(quantity)를 지나서 transaction.commit 하는 시점에 다른 스레드가 stockService.decrease(quantity)를 수행할 수 있다.

     

 

잠시 착각했던것 같습니다.

stockService.decrease(quantity) 이 메소드가 아닌,

public void decrease(Long quantity){} 이 메소드가 synchronized 되었다고 착각했네요...

0

최상용

넵넵! 말씀해주신대로 이해하시면 될 것 같습니다 😄

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

43

2

낙관적 락을 사용할 떄 차이점

0

120

2

동시성 검증 코드에 관한 문의

0

94

2

단일연산

0

70

2

낙관적락vs. 레디스락

0

108

2

안녕하세요. 레디슨 질문있습니다..!!

0

67

2

@Lock(OPTIMISTIC)이 필요한 이유

0

90

2

get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?

0

132

2

DataSource Hikari 사용 이유

0

147

2

saveAndFlush 사용 이유 문의

0

113

3

비관적 락 VS 네임드 락

0

160

3

application.yaml 에 redis 정보

0

99

2

왜 클래스 이름에 Facade 가 붙나요?

0

185

2

@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.

0

219

2

@modifying 이용한 동시성 제어

0

168

2

DB락과 분산락

0

260

2

NamedLock 테스트 실패

0

186

2

테스트에서 트랜잭션 어노테이션 질문 있습니다.

0

172

2

optimistic Lock 재시도 질문입니다.

0

230

2

낙관적 락 테스트 실패

0

239

2

오류?

0

1627

4

LettureLockStockFacadeTest에서 오류가 발생합니다.

1

268

2

Pessimistic Lock 전체 테스트 오류 문의

0

360

3

비관적 락 vs 레디스(Lettuce)락 비교 관련 질문

0

460

2