Babelfish의 트랜잭션 격리 수준
Babelfish는 트랜잭션 격리 수준 READ UNCOMMITTED
, READ COMMITTED
, SNAPSHOT
을 지원합니다. Babelfish 3.4 버전부터 추가 격리 수준 REPEATABLE READ
및 SERIALIZABLE
이 지원됩니다. Babelfish의 모든 격리 수준은 PostgreSQL의 해당 격리 수준 동작으로 지원됩니다. SQL Server와 Babelfish는 트랜잭션 격리 수준(동시 액세스 차단, 트랜잭션에 의한 잠금, 오류 처리 등)을 구현하기 위해 서로 다른 기본 메커니즘을 사용합니다. 또한 워크로드에 따라 동시 액세스가 작동하는 방식에도 미묘한 차이가 있습니다. 이 PostgreSQL 동작에 대한 자세한 내용은 트랜잭션 격리
트랜잭션 격리 수준 개요
원래의 SQL Server 트랜잭션 격리 수준은 데이터 사본이 하나만 존재하고 쿼리가 행과 같은 리소스를 잠가야 액세스할 수 있는 수동적 잠금을 기반으로 합니다. 이후에 READ COMMITTED
격리 수준의 변형이 도입되었습니다. 이를 통해 행 버전을 사용하여 비차단 액세스를 사용하는 리더와 라이터 간의 동시성이 높아졌습니다. 이 외에도 SNAPSHOT
이라는 새로운 격리 수준을 사용할 수 있습니다. 또한 행 버전을 사용하여 트랜잭션이 끝날 때까지 유지되는 읽기 데이터에 대한 공유 잠금을 피함으로써 REPEATABLE READ
격리 수준보다 더 나은 동시성을 제공합니다.
SQL Server와 달리 Babelfish의 모든 트랜잭션 격리 수준은 낙관적 잠금(MVCC)을 기반으로 합니다. 각 트랜잭션은 기본 데이터의 현재 상태에 관계없이 문의 시작 부분(READ COMMITTED
) 또는 트랜잭션 시작 부분(REPEATABLE READ
, SERIALIZABLE
)에서 데이터 스냅샷을 확인할 수 있습니다. 따라서 Babelfish의 동시 트랜잭션 실행 동작은 SQL Server와 다를 수 있습니다.
SQL Server에서 처음에는 차단되었다가 나중에 성공하는 격리 수준 SERIALIZABLE
의 트랜잭션을 예로 들어 보겠습니다. Babelfish에서는 동일한 행을 읽거나 업데이트하는 동시 트랜잭션과의 직렬화 충돌로 인해 실패로 끝날 수 있습니다. 동시 트랜잭션을 여러 개 실행하면 SQL Server와 비교하여 Babelfish의 최종 결과가 달라지는 경우도 생길 수 있습니다. 격리 수준을 사용하는 애플리케이션은 동시성 시나리오를 철저하게 테스트해야 합니다.
SQL Server 격리 수준 | Babelfish 격리 수준 | PostgreSQL 격리 수준 | 설명 |
---|---|---|---|
|
|
|
|
|
|
|
SQL Server |
|
|
|
둘 다 스냅샷(MVCC) 기반이지만 완전히 동일하지는 않습니다. |
|
|
|
완전히 동일합니다. |
|
|
|
SQL Server |
|
|
|
SQL Server |
참고
테이블 힌트는 현재 지원되지 않으며 해당 동작은 Babelfish의 사전 정의된 이스케이프 해치 escape_hatch_table_hints
를 사용하여 제어됩니다.
트랜잭션 격리 수준 설정
다음 명령을 사용하여 트랜잭션 격리 수준을 설정합니다.
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
트랜잭션 격리 수준 활성화 또는 비활성화
Babelfish에서는 트랜잭션 격리 수준 REPEATABLE READ
및 SERIALIZABLE
이 기본적으로 비활성화되어 있으며, sp_babelfish_configure
를 사용해 babelfishpg_tsql.isolation_level_serializable
또는 babelfishpg_tsql.isolation_level_repeatable_read
이스케이프 해치를 pg_isolation
으로 설정하여 명시적으로 활성화해야 합니다. 자세한 내용은 이스케이프 해치를 사용하여 Babelfish 오류 처리 관리 단원을 참조하십시오.
다음은 각각의 이스케이프 해치를 설정하여 현재 세션에서 REPEATABLE READ
및 SERIALIZABLE
사용을 활성화 또는 비활성화하는 예제입니다. 필요에 따라 현재 세션뿐만 아니라 이후의 모든 새 세션에 대한 이스케이프 해치를 설정하는 server
파라미터를 포함하세요.
현재 세션에서만 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
를 사용하도록 설정합니다.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
를 현재 세션과 이후의 모든 새 세션에서 사용하도록 설정합니다.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
를 현재 세션과 이후의 새 세션에서 사용할 수 없도록 합니다.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'
현재 세션에서만 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
를 사용하도록 설정합니다.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
를 현재 세션과 이후의 모든 새 세션에서 사용하도록 설정합니다.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
를 현재 세션과 이후의 새 세션에서 사용할 수 없도록 합니다.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'