1. 개요
- 일전 작성한 동시성 제어에서 이어지는 글이며, 현재 현업에서 통용하며 단순하게 제어를 할 수 있는 방법을 기술한다.
2. 동시성 제어를 할 수 있는 여러가지 방법
- 쿼리/DB 차원의 동시성 제어
-> 해당 행에 대한 처리를 진행할 경우 row lock을 하는데, 이때 for update wait ms or 채번 자체를 진행할때(select max + 1) for update하여 PK violation을 방지한다.
-> select key와 같은 mybatis 기능을 이용하여 처리 시점과 채번 시점을 최대한 동일하게 맞추어 주는 것도 방법이다.
- java / 객체 차원의 동시성 제어
-> 전산처리 시 객체 자체를 lock하는 방법이 있는데, 싱글톤 패턴을 이용하여 트랜잭션 중복 방지를 할 수 있기도 하다(보통 통용되는 방법).
- parellel, 데이터 병렬 처리
-> 트랜잭션을 paralell(java 기능)을 할 수 도 있지만, 이는 단일 트랜잭션을 보장하지 않는 별개의 데이터 처리로 인식하므로 여기서는 논외로 한다.
-> 이 부분은 동시성 제어라기 보다는 성능 개선의 의미로 볼 수 있다.
3. 추가 개념
- DB Sequence와 채번 테이블은 완전히 다른 개념이고, 보통 채번 테이블에서 PK값을 SELECT (max + 1)한 후, 사용한 채번 값으로 update 하는 방식을 사용한다.
- 이 방법을 대체하기 위해 나온 기능이 DB Sequence 인데, DB이중화 및 백업 DB 등 시퀀스를 동시에 사용할 경우 PK violation이 발생할 수 있기에 이에 대한 대안을 따로 생각해야 한다.
- 무엇보다 DB sequence를 사용할 경우 중간에 누락된 일련번호가 발생할 수 있으므로 유의해야 한다.
4. 참고자료
자바 트랜잭션 병렬처리 : https://mangkyu.tistory.com/312