'Synchronized 이용해보기' 강의에서 질문이 있습니다.
289
작성한 질문수 11
제가 이해한 바는 다음과 같습니다.
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
67
2
낙관적 락을 사용할 떄 차이점
0
147
2
동시성 검증 코드에 관한 문의
0
110
2
단일연산
0
89
2
낙관적락vs. 레디스락
0
121
2
안녕하세요. 레디슨 질문있습니다..!!
0
78
2
@Lock(OPTIMISTIC)이 필요한 이유
0
106
2
get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?
0
143
2
DataSource Hikari 사용 이유
0
162
2
saveAndFlush 사용 이유 문의
0
126
3
비관적 락 VS 네임드 락
0
174
3
application.yaml 에 redis 정보
0
103
2
왜 클래스 이름에 Facade 가 붙나요?
0
194
2
@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.
0
226
2
@modifying 이용한 동시성 제어
0
179
2
DB락과 분산락
0
279
2
NamedLock 테스트 실패
0
192
2
테스트에서 트랜잭션 어노테이션 질문 있습니다.
0
184
2
optimistic Lock 재시도 질문입니다.
0
246
2
낙관적 락 테스트 실패
0
256
2
오류?
0
1645
4
LettureLockStockFacadeTest에서 오류가 발생합니다.
1
274
2
Pessimistic Lock 전체 테스트 오류 문의
0
384
3
비관적 락 vs 레디스(Lettuce)락 비교 관련 질문
0
474
2





