트랜잭션 동시성 제어에 대해서 공부를 하는데 lock과 관련해서 많은 얘기가 나왔다. 생각보다 기본 개념이 안 잡힌 부분들이 있는 거 같아 이번 기회에 정리를 한 번 하고자 한다. 1. Shared and Exclusive Locks(sLocks and xLocks) InnoDB는 두 가지 유형의 row-level locking을 수행한다. shared Lock row를 조회하는데 필요한 lock Exclusive Lock row를 update/delete하는데 필요한 lock 시나리오 트랜잭션 T1, T2가 있을 때, T1이 특정 row를 read하기 위해 sLock를 가져갔다고 가정하자. T2가 같은 row에 대해서 read하기 위해 sLock 가져갈 수 있다. 하지만 T2가 같은 row에 대해서 u..
전체 글
저번 글([JPA] @Transactional과 synchronized를 동시에 사용할 때의 DB 동기화 이슈)에 이어 이번엔 왜 멀티 쓰레드 환경에서 하나의 트랜잭션에서 하나의 row 데이터에 접근하여 데이터를 변경하는 쿼리를 날리고(flush), 다른 트랜잭션에서 같은 데이터 row에 접근했을 때 변경되지 않은 데이터 값을 가져오는지 알아보기 위해 MVCC에 대해 알아보고 MySQL이 어떻게 동시성 제어를 하는지 보도록 한다. MVCC? Multi Version Control Concurrency의 약자로 다중 버전 동시성 제어라고 한다. Locking의 성능 문제 때문에 탄생하게 되었다. Lock을 사용하지 않고 일관된 읽기를 제공하는 것이 주 목적이다. 사용자는 MVCC에서 데이터에 접근할 때 S..
오늘 인프런의 재고시스템으로 알아보는 동시성이슈 해결방법이란 강의 중 synchronized를 사용하여 동시성이슈를 해결하는데에서 궁금한 점이 발생했다. 참고로 이 강의에선 springboot, jpa와 함께 mysql을 연결하여 사용한다. // StockService 내 decrease 메서드, 여기서 동시성 이슈 발생 @Transactional public synchronized void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } @Test public void 동..
트랜잭션 트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다. 이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있으며 이를 한꺼번에 ACID 특징이라고 한다. 하나의 트랜잭션에선 하나의 쓰레드만 동작한다. 원자성(Atomicity) 원자성은 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다. 일관성(Consistency) 일관성은 트랜잭션이 일어나기 전의 상황과 동일하게 ‘허용된 방식’으로만 데이터를 변경해야 하는 것을 의미한다. 격리성(Isolation) 격리성은 각각의 트랜잭션이 독립적으로 수행되어야 함을 의미한다. 격리 레벨 SERIALIZABL..
@Transactional 어노테이션을 붙이면 프록시 패턴을 사용하는 스프링 AOP를 사용하고 DB connection pool에서 connection을 하나 가져오고 setAutoCommit 값을 false로 초기화하고 트랜잭션 종료 시에 다음 2가지로 동작한다. 정상 작동 시 commit(동시에 flush) 에러 발생 시 rollback 트랜잭션이 종료될 때 다시 setAutoCommit 값을 True로 초기화해 준다. 위 DataSourceTransactionManager Class에서 볼 수 있듯이 JDBC커넥션을 DataSource로부터 현재 쓰레드에 바인딩하고, 이는 잠재적으로 DataSource당 하나의 쓰레드를 바인딩한다는 것으로 하나의 트랜잭션은 단일 쓰레드에서 동작한다.