1-1. Synchronized
- 멀티 스레드 환경에서 동기화를 할 수 있게 해주는 자바가 제공하는 키워드이다.
synchronized
키워드를 동기화를 원하는 메소드에 추가해주면 간편하게 동기화가 가능하다.
- 스레드가 메소드를 사용하고 있을 때 다른 스레드의 접근을 차단하기 때문에 다른 스레드들은 대기하게 된다.
1-2. Synchronized의 문제점
synchronized
는 하나의 프로세서 안에서만 동기화를 보장하기 때문에 멀티 프로세스 환경에서는 권장하지 않는다.
- 서버가 2대 이상일 경우 동시성 제어를 보장할 수 없다.
@Transactional
과 함께 사용할 수 없다.
@Transactional
어노테이션은 메소드 외부에서 트랜잭션이 시작되고 끝난다.
synchronized
는 키워드가 붙은 메소드만을 동기화 해준다.
- 트랜잭션 시작 →
synchronized
로 동기화된 메소드 실행 → 트랜잭션 커밋(업데이트 쿼리는 이때 발생한다.)
- 즉, 메소드와 트랜잭션 커밋 사이에 다른 스레드가 데이터를 불러오게 된다면 동일하게 Lost Update가 발생하게 된다.
2-1. 배타적 락(Exclusive Lock)
배타적 락(Exclusive Lock)
이란 Lock을 걸고 Lock이 해제될 때 까지 다른 트랜잭션은 해당 리소스에 접근하지 못 하도록 하는 DB Lock이다.
INSERT
, UPDATE
뿐만 아니라 SELECT
하는 것도 막기 때문에 멀티 쓰레드 환경에서 안전하게 동기화를 할 수 있다.
- 트랜잭션 단위로 락을 관리하기 때문에
@Transactional
을 사용하거나 직접 트랜잭션 시작, 커밋을 설정해주어야 한다.
- JPA나 QueryDSL을 활용한다면 락을 원하는 시점에 락을 걸어주면 되기 때문에 사용법이 간편하다.