전체 글149 Redisson 분산락 사용시 발생하는 문제 1. 발생한 문제 @Transactional public void testbookorder(Long bookid, Integer quantity, Member member) { final String lockname = bookid + ":lock"; final RLock lock = redissonClient.getLock(lockname); try { if (!lock.tryLock(3, 1, TimeUnit.SECONDS)) { throw new RuntimeException("Rock fail"); } Thread.sleep(10); Book book = bookRepository.findById(bookid).orElseThrow( () -> new CustomException(ErrorCode.. 2023. 4. 20. 20230420 TIL 1. 부정적 락과 분삭락 1)Pessimistic_write 트랜잭션을 시작할 때 Shared/Exclusive Lock을 적용한다. 따라서 동시성 충돌이 잦을 것으로 예상되어 동시성을 강력하게 지켜야 할 때 사용하여 야 한다. 충돌이 빈번하게 일어난다면 Optimistic보다 성능이 좋고, 데이터 정합성이 안정적이다. 하지만 별도의 Lock을 잡기 때문에 속도가 느리고, 경우에 따라 DeadLock 의 위험성이 있음은 유의 해야 한다. 단일 테이블에 요청을 하는 경우 가능성이 적지만 여러 테이블에 Lock을 걸면서 서로 자원이 필요한 경우 데드락이 발생할 수 있으며, 비관적 락으로 해결할 수 없다. 다음과 같은 예시 상황이 있다 트랜잭션 A가 테이블1의 1번 데이터에 lock을 획득 트랜잭션 B가 테이.. 2023. 4. 19. 230419 TIL 1. 테스트 코드 작성하기 Service @Transactional public void bookorder(Long bookid, Integer quantity, Member member){ Book book = entityManager.find(Book.class,bookid,LockModeType.PESSIMISTIC_FORCE_INCREMENT); Long inven = book.getInventory()-quantity; if (inven new JumoonWorker(members.get(0),book,3,countDownLatch)) .limit(20) .collect(Collectors.toList()); workers.forEach(worker -> new Thread(worker).sta.. 2023. 4. 19. 230414 TIL 1. Spring batch 책 주문이 쌓이면 02시에 전날 02시 부터 쌓였던 주문들을 탐색하고 주문을 완료시킨다(취소 못하게 한다) 해당 주문들을 통해 어떤 책이 얼마나 팔렸는지 분석하여 ranking을 만들고 redis 서버에 rank 키 이름으로 올린다. 만약 불의의 사고로 redis서버의 데이터가 날아간 경우 서비스 단에서 redis에 랭킹을 다시 만들어 준다. 이것은 아래에 더 자세히 설명할 것이다. 2. 작성한 코드 1)BatchScheduler @Slf4j @Component public class BatchScheduler { @Autowired private JobLauncher jobLauncher; @Autowired private FakejumoonConfig fakejumoonC.. 2023. 4. 14. 이전 1 ··· 20 21 22 23 24 25 26 ··· 38 다음