<@U0A71G31CDV> starrocks에 atomic연산 지원안해?
# questions-and-troubleshooting
s
@Rocky starrocks에 atomic연산 지원안해?
r
StarRocks는 *원자성(Atomicity)*을 다양한 수준에서 지원합니다. 크게 데이터 적재(Loading)와 SQL 트랜잭션 두 가지 관점으로 나누어 설명해 드립니다. 1. 데이터 적재(Loading)의 원자성 StarRocks의 모든 데이터 적재 방식(Stream Load, Broker Load, Routine Load, INSERT INTO 등)은 기본적으로 *단일 작업 단위의 원자성*을 보장합니다. * 적재하려는 데이터 전체가 성공적으로 들어가거나, 에러 발생 시 전체가 취소(Rollback)됩니다. 일부만 들어가는 현상은 발생하지 않습니다. 2. SQL 트랜잭션 (Multi-statement) 과거에는 단일 SQL 문 단위로만 원자성이 보장되었으나, 최신 버전에서는 여러 SQL 문을 하나로 묶는 트랜잭션 기능이 추가되었습니다. * v3.5.0 이상:
BEGIN
,
COMMIT
,
ROLLBACK
구문을 사용하는 SQL Transaction 기능이 도입되었습니다(Beta). * 이를 통해 여러 개의
INSERT
,
UPDATE
,
DELETE
작업을 하나의 원자적 단위로 처리할 수 있습니다. * 단, *v4.0 미만*이나 Shared-nothing(기본) 환경에서는 동일 테이블에 대한 다중 INSERT나 UPDATE/DELETE 혼용 등에 일부 제약이 있을 수 있으니 버전에 따른 문서를 확인해야 합니다. 3. 실시간 업데이트 (Primary Key 테이블) 실시간으로 데이터를 업데이트하거나 `col = col + 1`과 같은 연산이 필요한 경우, StarRocks의 *Primary Key 테이블 모델*을 사용하면 원자적인 Upsert 및 Delete가 가능합니다. 4. Stream Load 트랜잭션 인터페이스 API를 통해 데이터를 적재할 때도 트랜잭션 인터페이스(
/api/transaction/begin
등)를 사용하면, 여러 번의 데이터 전송을 하나의 트랜잭션으로 묶어 원자성을 보장하며 커밋할 수 있습니다. 요약하자면: StarRocks는 *단일 적재 작업의 원자성은 항상 지원*하며, *v3.5 이상부터는 일반적인 SQL 트랜잭션(BEGIN/COMMIT)*을 통해 여러 문장의 원자성도 지원하기 시작했습니다. 사용 중인 StarRocks 버전을 확인해 보시는 것을 권장합니다. References • loading/SQL_transaction.md • loading/loading_introduction/loading_concepts.md • loading/Stream_Load_transaction_interface.md
s
아니 명시적인 lock베이스, 너가말한건 항상 동시성 이슈가 있고, postgresql처럼 동시성 제어 가능한 기능이 있냐고
@Rocky 아니 명시적인 lock베이스, 너가말한건 항상 동시성 이슈가 있고, postgresql처럼 동시성 제어 가능한 기능이 있냐고
r
StarRocks는 PostgreSQL과 같은 전통적인 OLTP 데이터베이스와는 동시성 제어 방식이 다릅니다. 결론부터 말씀드리면, 사용자가 직접 제어하는 명시적 락(Explicit Lock, 예: `SELECT ... FOR UPDATE`나
LOCK TABLE
)은 지원하지 않습니다.
StarRocks는 대규모 분석(OLAP)에 최적화된 엔진이기 때문에, 행 단위의 비관적 락(Pessimistic Lock) 대신 다음과 같은 방식으로 동시성 이슈를 해결합니다. 1. 왜 PostgreSQL 같은 락이 없나요? * 분산 아키텍처: 수많은 노드에 데이터가 분산되어 있어, 특정 행에 글로벌하게 락을 거는 비용이 매우 큽니다. * OLAP 최적화: StarRocks는 대량의 읽기/쓰기에 최적화되어 있어, 락을 대기하는 방식보다는 MVCC(Multi-Version Concurrency Control)와 낙관적 방식을 선호합니다. * 트랜잭션 격리: v3.5부터 지원하는 SQL 트랜잭션도
READ COMMITTED
수준이며, 쓰기 충돌 체크(Write conflict check)를 수행하지 않습니다. 두 트랜잭션이 동시에 같은 테이블을 수정하면 먼저 커밋된 것이 반영되거나 나중에 커밋된 것이 덮어쓰는 구조입니다. 2. 동시성 이슈를 해결하는 StarRocks의 방식 PostgreSQL의 락 대신 StarRocks에서는 다음 기능을 사용하여 데이터 정합성을 유지합니다. ① Primary Key 테이블의 '조건부 업데이트 (Conditional Update)' 동시 업데이트 이슈를 해결하는 가장 핵심적인 기능입니다. *낙관적 락(Optimistic Lock)*과 유사하게 동작합니다. *
merge_condition
설정을 통해 특정 컬럼(예:
version
또는
updated_at
)의 값이 기존 값보다 크거나 같을 때만 업데이트가 성공하도록 강제할 수 있습니다. * 이를 통해 동시성 상황에서 "과거 데이터가 최신 데이터를 덮어쓰는 문제"를 원자적으로 방지합니다. ② Primary Key 테이블의 'Partial Update' 특정 컬럼만 업데이트할 때, 전체 행을 읽어와서 수정 후 다시 쓰는(Read-Modify-Write) 과정 없이 엔진 레벨에서 특정 컬럼만 원자적으로 교체합니다. ③ INSERT OVERWRITE (파티션 단위 원자성) 데이터 전체를 교체해야 할 때, 락을 거는 대신 새로운 임시 파티션에 데이터를 다 적재한 뒤 Atomic Swap 방식으로 한 번에 교체합니다. 읽기 작업은 중단되지 않으며 정합성이 보장됩니다. 요약 기능 | PostgreSQL | StarRocks 명시적 락 |
SELECT FOR UPDATE
,
LOCK TABLE
지원 | 지원 안 함 격리 수준 |
SERIALIZABLE
등 높음 |
READ COMMITTED
(제한적) 충돌 제어 | 락 대기 및 Deadlock 감지 | Conditional Update (버전 비교) 사용 권장 모델 | OLTP (트랜잭션 위주) | Primary Key 테이블 모델 권장 따라서 PostgreSQL처럼 `FOR UPDATE`로 행을 잠그고 로직을 수행하는 방식이 필요하다면, StarRocks에서는 Primary Key 테이블과 버전 컬럼(Sequence column)을 조합한 조건부 업데이트 방식을 설계해야 합니다. References • loading/Load_to_Primary_Key_tables.md • loading/SQL_transaction.md • sql-reference/sql-statements/table_bucket_part_index/auto_increment.md References • loading/Load_to_Primary_Key_tables.md • sql-reference/sql-statements/table_bucket_part_index/auto_increment.md • loading/SQL_transaction.md