동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법
- 다중 사용자 환경을 지원하는 데이터 베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능.
- 다중 사용자 환경을 지원하는 DB System의 경우 필수적으로 지원해야하는 기능으로 병행제어라고도 한다.
- 트랜잭션의 직렬화 수행 보장.
- 스레드는 Stack 영역을 제외한 Data, Code, Heap영역을 공유하는데 Heap영역에 참조 변수들이 load되어 서로 공유된다. 이 때 Heap 영역에 있는 변수들을 여러 스레드가 동시에 접근하게 되어 계산했을 시, 예상하는 결과와 다른 문제가 생길 수 있는데 이를 동시에 접근하여 문제가 생기는 것들을 동시성 문제라고 한다.
- 트랜잭션의 직렬성 보장
- 공유도 최대, 응답 시간 최소, 시스템 활동의 최대 보장
- 데이터의 무결성 및 일관성 보장.
- 데이터가 수정되기 전에 다른 스레드에서 변경이 발생했는지 확인하고, 충돌이 있으면 수정 실패를 처리.
- 예시: **버전 필드(version)**를 사용하여 데이터가 수정될 때 버전이 맞는지 검증. 충돌 발생 시 수정 중단.
- 데이터 수정 전에 다른 스레드가 접근하지 못하도록 잠금을 설정하여 동시성을 제어.
- 예시: 특정 행에 대한 **행 레벨 락(row-level lock)**을 사용하여 해당 데이터가 완전히 안전하게 수정되도록 보장.
데이터베이스 트랜잭션 (Database Transactions):
- 모든 작업을 트랜잭션 단위로 처리하여, 트랜잭션 내에서 동시성 문제를 해결.
- ACID 속성을 통해 데이터 일관성을 보장.
- 예시 : 여러 스레드가 동시에 데이터베이스에 접근할 때, 트랜잭션이 완료되기 전까지 다른 스레드가 수정하지 못하게 함.
장점
데이터 일관성을 강하게 보장한다.
충돌 처리 로직이 단순하다.
단점
동시성이 떨어져 성능 저하가 발생할 수 있다.
데드락 발생 가능성이 있다.
"낙관적 락 선택 기준"
"비관적 락 선택 기준"
synchronized : 특정 메서드나 블록에 대해 동시 접근을 제한 하는 가장 기본적인 방법. ReentrantLock : 더 복잡한 잠금 방식을 제공하며, 명시적으로 잠금을 제어할 수 있음. 특히 타임아웃과 인터럽트 기능을 제공.ConcurrentHashMap : 동시성 문제를 해결하기 위해 특별히 설계된 데이터 구조로, 병렬성을 지원하며 여러 스레드가 안전하게 사용할 수 있음.
참조 :
[ 기술면접 / 데이터베이스 ] 동시성 제어( Concurrency Control )
Java 동시성 제어 - 멀티스레드, Syncronized, volatile, Atomic