'Synchronized 이용해보기' 강의에서 질문이 있습니다.
286
작성한 질문수 9
제가 이해한 바는 다음과 같습니다.
Transactional 어노테이션을 사용시
해당 메서드나 클래스 내의 모든 메서드가 하나의 트랜잭션으로 묶여 처리
synchronized를 사용시
동시에 같은 객체의 특정 메서드를 여러 스레드가 호출하지 못하게 하는 데 사용
그런데 1분 29초부터 설명을 들어보면
decrease 함수 안에서,
endTransaction을 수행하기 전에 다른 스레드가 decrease 메소드를 호출할 수 있다고 하셨습니다.
그런데 이 부분이 이해가 안됩니다. synchronized 키워드를 붙였다면, 동시에 같은 객체의 메서드를 다른 스레드가 호출하지 못하는것 아닌가요?
Transactional 어노테이션을 주석처리하면 동작하던데,
이 여부와 관계 없이 동작해야하는것 아닌가요?
답변 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
아아... 하기와 같이 이해하면 될까요!?
stockService.decrease(quantity) 이 메소드는 한번의 하나의 스레드만 접근할 수 있다.
하나의 스레드가 stockService.decrease(quantity)를 지나서 transaction.commit 하는 시점에 다른 스레드가 stockService.decrease(quantity)를 수행할 수 있다.
잠시 착각했던것 같습니다.
stockService.decrease(quantity) 이 메소드가 아닌,
public void decrease(Long quantity){} 이 메소드가 synchronized 되었다고 착각했네요...
레디선 테스트코드에서 채널이름은 없어도 되는건가요?
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





