springboot6 [Java / Spring Boot] 스투시 반팔티를 10명이 동시에 주문했을 때 발생한 일-2편 배경재고가 1개뿐인 상품에 10명이 동시에 주문을 넣었다.결과는 10명 전부 주문 성공이었다. 에러도 없이. 재고는 -9가 됐다. 음.....?뭐가 문제인지 보기 전엔 몰랐다재고 차감 코드는 단순해 보인다.@Transactionalpublic void order(Long optionId, int quantity) { Stock stock = stockRepository.findByOptionId(optionId); // 1. 재고 읽기 if (stock.getQuantity() @Transactional도 붙어있고, 재고 확인도 하고 있으니 괜찮은 거 아닌가?문제는 2번 재고 확인 시점에서 생긴다.왜 이런 일이 생기나: Lost Update10개 트랜잭션이 동시에 실행될 때 실제로 어떤 일이 .. 2026. 3. 6. [Java / Spring Boot] @Transactional 붙이면 동시성이 다 해결될 줄 알았다 -1편 "동시성해봤어?""응, @Transactional붙여서 하다가에러나면 롤백 자동으로 해주는 거 아니야?"트랜잭션이란 깨질 수 없는 하나의 흐름이니까, 문제가 생기면 다 롤백되는 거라고 생각했다. 그러다 직접 실험해보면서 정리가 되었다@Transactional이 보장하는 것트랜잭션은 ACID를 보장한다. 그런데 Isolation(격리성) 은 "어느 수준까지" 격리할지 설정에 따라 다르다.Spring의 기본 격리 수준은 DB 기본값을 따른다. MySQL InnoDB 기준으로는 REPEATABLE READ다.@Transactional // 기본값: Isolation.DEFAULT → DB 기본값 사용public void doSomething() { ... }@Transactional(isolation = Is.. 2026. 3. 5. 이전 1 2 다음 반응형