다중 연결
다중 연결 (Multiple Connections)
트랜잭션 관리나 데이터 버저닝이 제대로 동작하는지 확인하는 테스트는 보통 여러 연결을 사용해야 해요. 오늘은 sqllogictest에서 connection labels로 다중 연결을 다루는 방법을 함께 알아볼까요?
출처: 문서
본문
트랜잭션 관리나 데이터의 버전 관리가 올바르게 동작하는지 검증하는 것이 목적인 테스트는 일반적으로 여러 연결을 사용해야 해요. 예를 들어, 테이블 생성이 제대로 트랜잭셔널하게 처리되는지 확인하고 싶다면 con1에서 트랜잭션을 시작하고 테이블을 만든 뒤, con2에서 해당 테이블이 커밋되기 전까지 접근할 수 없는지 확인하는 쿼리를 실행해 볼 수 있어요.
sqllogictest에서는 connection labels를 사용해서 다중 연결을 활용할 수 있어요. 연결 레이블은 선택적으로 어떤 statement나 query에도 붙일 수 있답니다. 같은 연결 레이블을 가진 모든 쿼리는 같은 연결에서 실행돼요. 위 속성을 검증하는 테스트는 다음과 같이 생겼어요:
statement ok con1
BEGIN TRANSACTION
statement ok con1
CREATE TABLE integers (i INTEGER);
statement error con2
SELECT * FROM integers;
동시 연결 (Concurrent Connections)
statement와 query에 연결 수정자를 사용하면 다중 연결 테스트가 되지만, 모든 쿼리는 여전히 단일 스레드에서 순차적으로 실행돼요. 여러 연결의 코드를 여러 스레드에서 동시에 실행하고 싶다면 concurrentloop 구문을 사용할 수 있어요. concurrentloop 안의 쿼리들은 서로 다른 스레드에서 동시에 실행된답니다.
concurrentloop i 0 10
statement ok
CREATE TEMP TABLE t2 AS (SELECT 1);
statement ok
INSERT INTO t2 VALUES (42);
statement ok
DELETE FROM t2
endloop
concurrentloop의 한 가지 주의점은 결과가 예측 불가능한 경우가 많다는 거예요. 여러 클라이언트가 동시에 데이터베이스를 때리다 보면 (예상 가능한) 트랜잭션 충돌이 생길 수 있거든요. 이런 상황을 다루려면 statement maybe를 사용할 수 있어요. statement maybe는 본질적으로 성공과, 특정 에러 메시지를 동반한 실패 둘 다 허용해 줘요.
concurrentloop i 1 10
statement maybe
CREATE OR REPLACE TABLE t2 AS (SELECT -54124033386577348004002656426531535114 FROM t2 LIMIT 70%);
----
write-write conflict
endloop