Akashic Records

Oracle Transaction Isolation Level 본문

Database Learning Guide

Oracle Transaction Isolation Level

Andrew's Akashic Records 2023. 3. 14. 13:21
728x90

트랜잭션 고립 수준(Isolation Level)은 여러 개의 트랜잭션이 동시에 실행될 때, 각 트랜잭션이 다른 트랜잭션의 작업에 영향을 미치는 정도를 나타냅니다. 고립 수준이 높을수록 동시성이 감소하고 데이터 일관성이 높아집니다.

 

● Read uncommitted (RU)

Read uncommitted는 가장 낮은 고립 수준으로, 커밋되지 않은 데이터를 읽을 수 있습니다. 다른 트랜잭션이 커밋하기 전에 데이터를 읽어올 수 있으며, 이 경우 Dirty Read가 발생할 수 있습니다. Dirty Read란, 아직 커밋되지 않은 데이터를 읽어온 후 해당 데이터를 업데이트하는 작업을 수행했을 때, 해당 트랜잭션이 롤백되면 이전에 읽었던 데이터와는 달라져 버그를 발생시킬 수 있는 문제를 말합니다.

 

 Read committed (RC)

Read committed는 RU보다 고립 수준이 높은 수준으로, 커밋된 데이터만 읽을 수 있습니다. 즉, 다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다. 이 경우 Non-repeatable Read가 발생할 수 있습니다. Non-repeatable Read란, 같은 트랜잭션에서 같은 쿼리를 수행했을 때, 다른 값을 반환하는 문제를 말합니다. 이는 다른 트랜잭션이 커밋된 데이터를 읽어올 수 있기 때문에 발생합니다.

 

 Repeatable read (RR)

Repeatable read는 Read committed보다 높은 고립 수준으로, 같은 쿼리를 수행해도 결과가 항상 일치합니다. 다른 트랜잭션에서 데이터를 변경하더라도 해당 트랜잭션이 끝날 때까지 해당 데이터는 읽을 수 없습니다. 이 경우 Phantom Read가 발생할 수 있습니다. Phantom Read란, 같은 트랜잭션에서 같은 쿼리를 수행했을 때, 다른 결과가 반환되는 문제를 말합니다. 이는 다른 트랜잭션이 새로운 데이터를 삽입하는 경우 발생할 수 있습니다.

 

 Serializable (S)

Serializable은 가장 높은 고립 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것과 같은 효과를 보장합니다. 따라서 Phantom Read가 발생하지 않습니다. 하지만 동시성이 매우 낮아지며, 데이터 일관성을 보장하기 위한 대가로 처리 속도가 느려질 수 있습니다. 따라서 Serializable 고립 수준은 필요한 경우에만 사용해야 합니다.

 

트랜잭션 고립 수준은 트랜잭션의 일관성과 동시성 사이에서 타협점을 찾아야 합니다. 데이터 일관성을 우선시해야 하는 경우 Serializable 고립 수준을 사용하고, 동시성을 우선시해야 하는 경우 Read committed 또는 Repeatable read 고립 수준을 사용하는 것이 좋습니다.

 

Oracle 데이터베이스에서는 다양한 고립 수준을 지원하며, 트랜잭션의 고립 수준은 BEGIN TRANSACTION 문장에서 SET TRANSACTION ISOLATION LEVEL을 사용하여 설정할 수 있습니다. 예를 들어, 다음과 같은 SQL문을 사용하여 고립 수준을 설정할 수 있습니다.

 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

 

Oracle 데이터베이스에서는 기본적으로 Read committed 고립 수준을 사용하며, 다른 고립 수준을 사용하려면 명시적으로 설정해야 합니다. 또한, Serializable 고립 수준은 Oracle 데이터베이스에서 구현되지 않았으며, Repeatable read 고립 수준과 유사한 Snapshot 고립 수준을 사용할 수 있습니다.

트랜잭션 고립 수준 설정 방법

트랜잭션 고립 수준은 각 데이터베이스 시스템에서 다양한 방법으로 설정할 수 있습니다.

 

Oracle 데이터베이스에서는 트랜잭션 고립 수준을 다음과 같이 설정할 수 있습니다.

  • READ COMMITTED : 기본값입니다.
  • READ ONLY : 모든 트랜잭션을 읽기 전용으로 설정합니다.
  • SERIALIZABLE : 가장 높은 고립 수준으로 모든 트랜잭션을 직렬화합니다.

위의 고립 수준은 ALTER SESSION 문을 사용하여 설정할 수 있습니다.

-- READ COMMITTED로 트랜잭션 고립 수준 설정
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;

-- READ ONLY로 트랜잭션 고립 수준 설정
ALTER SESSION SET ISOLATION_LEVEL = READ ONLY;

-- SERIALIZABLE로 트랜잭션 고립 수준 설정
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;

 

MySQL 데이터베이스에서는 트랜잭션 고립 수준을 다음과 같이 설정할 수 있습니다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ : 기본값입니다.
  • SERIALIZABLE

위의 고립 수준은 SET TRANSACTION 문을 사용하여 설정할 수 있습니다.

-- READ UNCOMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- READ COMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- REPEATABLE READ로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- SERIALIZABLE로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

PostgreSQL 데이터베이스에서는 트랜잭션 고립 수준을 다음과 같이 설정할 수 있습니다.

  • READ UNCOMMITTED
  • READ COMMITTED : 기본값입니다.
  • REPEATABLE READ
  • SERIALIZABLE

위의 고립 수준은 SET TRANSACTION 문을 사용하여 설정할 수 있습니다.

-- READ UNCOMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- READ COMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- REPEATABLE READ로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- SERIALIZABLE로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

SQL Server 데이터베이스에서는 트랜잭션 고립 수준을 다음과 같이 설정할 수 있습니다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE : 기본값입니다.

위의 고립 수준은 SET TRANSACTION 문을 사용하여 설정할 수 있습니다.

-- READ UNCOMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- READ COMMITTED로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- REPEATABLE READ로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- SERIALIZABLE로 트랜잭션 고립 수준 설정
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

즉, 각 데이터베이스 시스템에서는 다양한 방법으로 트랜잭션 고립 수준을 설정할 수 있으며, 대부분의 경우 해당 데이터베이스 시스템의 문서를 참조하여 설정 방법을 확인할 수 있습니다.

728x90
Comments