동시성
동시성 (Concurrency)
DuckDB 프로세스 안팎에서의 동시성 처리 방식과 동시성 제어 모델을 살펴볼게요. 읽기 중심의 분석 데이터베이스 특성에 맞춘 모델이라는 점이 특징이에요.
출처: 문서
본문
동시성 처리
단일 프로세스
인-프로세스 모드에서 DuckDB는 두 가지 구성 가능한 동시성 옵션이 있어요.
- 읽기-쓰기 모드: 한 프로세스가 데이터베이스에 읽기와 쓰기를 모두 할 수 있어요.
- 읽기 전용 모드: 여러 프로세스가 데이터베이스에서 읽을 수 있지만, 어떤 프로세스도 쓸 수 없어요 (
access_mode = 'READ_ONLY').
읽기-쓰기 모드를 사용할 때 DuckDB는 MVCC (Multi-Version Concurrency Control)와 낙관적 동시성 제어(optimistic concurrency control)의 조합(단일 프로세스 내 동시성 참고)을 사용해 여러 작성자 스레드를 지원하지만, 모두 그 단일 작성자 프로세스 내에서만 지원돼요. 이 동시성 모델의 이유는 각 쿼리 중 디스크를 오가기보다는 RAM에 데이터를 캐싱해 더 빠른 분석 쿼리를 허용하기 위해서예요. 또한 함수 포인터, 데이터베이스 카탈로그 등 다른 항목을 캐싱해 같은 커넥션의 후속 쿼리를 더 빠르게 해줘요.
단일 프로세스 내 동시성 모델
DuckDB는 다음 규칙에 따라 단일 프로세스 내 동시성을 지원해요. 쓰기 충돌이 없는 한 여러 동시 쓰기는 성공해요. Append는 같은 테이블에서도 절대 충돌하지 않아요. 여러 스레드가 별도의 테이블이나 같은 테이블의 별도 부분 집합을 동시에 업데이트할 수도 있어요. 두 스레드가 동시에 같은 행을 편집(업데이트 또는 삭제)하려 할 때 낙관적 동시성 제어가 작동해요. 그 상황에서 편집을 시도하는 두 번째 스레드는 충돌 오류로 실패해요.
여러 프로세스
여러 프로세스에서 DuckDB의 네이티브 데이터베이스 형식에 쓰는 것은 Quack 원격 프로토콜을 통해 지원돼요. 이는 DuckDB를 클라이언트-서버 데이터베이스로 바꿔줘요. Quack은 DuckDB v1.5.2 기준 베타 단계이며, 2026년 가을의 DuckDB v2.0에서 성숙해질 것으로 예상돼요.
안정적인 솔루션을 원한다면 PostgreSQL을 카탈로그 데이터베이스로 사용하는 DuckLake 형식을 고려해요. 중앙 PostgreSQL 카탈로그를 통해 조정함으로써 DuckDB 인스턴스는 같은 데이터베이스에 대한 동시 읽기-쓰기를 달성할 수 있어요. DuckLake v1.0 스펙과 그 DuckDB 구현은 모두 프로덕션 사용을 목적으로 하며, 2026년 4월에 게시됐어요.
낙관적 동시성 제어
DuckDB는 낙관적 동시성 제어를 사용해요. 이는 읽기 중심의 분석 데이터베이스 시스템에 가장 적합한 접근 방식으로 일반적으로 간주되며, 읽기 쿼리 처리를 가속화하기 때문이에요. 그 결과 동시에 같은 행을 수정하는 트랜잭션이 있으면 트랜잭션 충돌 오류가 발생해요.
Transaction conflict: cannot update a table that has been altered!
팁 트랜잭션 충돌이 발생할 때 흔한 해결 방법은 트랜잭션을 다시 실행하는 것이에요.
문제 해결
파일 잠금. DuckDB는 파일 잠금을 사용해 동시 데이터베이스 접근 요청을 처리해요. 공유 디렉토리(예: 다른 운영 체제에서 다른 파일 시스템을 사용하거나 네트워크 부착 저장소에서)의 DuckDB 데이터베이스 파일에 접근할 때는 특히 주의해요.