JPA

[JPA] Transaction

kelicia 2020. 8. 25. 00:44

 Transaction: 하나의 논리적 기능을 수행하기 위한 최소한의 단위. 

 

트랜잭션은 아래와 같이 ACID를 보장해야 한다.

 

- Atomic : 수행되는 작업들은 일부만 수행되거나 중단되지 않음을 보장해야함.

즉, 모두 수행되거나 모두 실패하거나. (all or nothing = commit or rollback)

 

- Consistency : 트랜잭션 완료 후 데이터는 항상 일관성을 유지해야함.

예를 들면 무결성 제약조건을 항상 만족해야함.

 

- Isolation : 트랜잭션끼리는 서로 간섭할 수 없음.

예를 들면 같은 데이터를 동시에 수정하지 못하도록 함.

동시성 관련 성능 이슈로 인해 Isolation level을 선택할 수 있음.

 

- Durability : 트랜잭션을 성공적으로 완료 후 그 결과가 영구적으로 반영되어야함.

시스템이 다운되어도 성공한 트랜잭션 내용이 복구되어야함.

 


여기서 문제는 Isolation.

이를 완벽하게 보장하려면 트랜잭션을 거의 순차적으로 실행해야 한다.

이러면 동시성 처리 성능이 매우 나빠지기 때문에... ANSI 표준은 Isolation level을 4단계로 구분함.

 

Isolation level이 낮은 것부터 나열해본다.

낮을수록 동시성은 증가하지만 level에 따라 다양한 문제점이 발생.

 

- READ UNCOMMITED : 커밋하지 않은 데이터를 읽을 수 있음. DIRTY READ를 허용하는 레벨.

 (문제1) DIRTY READ = TX1이 데이터를 수정하고 커밋하지 않아도 TX2가 TX1이 수정한 데이터를 읽을 수 있음. 만약 TX2가 이 데이터를 사용하는데 TX1이 롤백되면 데이터 정합성에 심각한 문제가 발생할 수 있음.

 (문제2) NON-REPEATABLE READ

 (문제3) PHANTOM READ

 

- READ COMMITTED : 커밋한 데이터만 읽을 수 있음. DIRTY READ를 허용하지 않는 레벨.

 (문제1) NON-REPEATABLE READ = TX1이 데이터 a를 읽고 커밋하지 않은 상태에서 TX2가 데이터 a를 수정하고 커밋했다고 가정했을 때, TX1이 데이터 a를 다시 읽으려고 하면 TX2 커밋 이전에 읽었던 값이 아닌 TX2가 수정한 값이 조회된다. 이렇게 같은 데이터를 반복해서 읽을 수 없는 문제를 말함.

 (문제2) PHANTOM READ

 

- REPEATABLE READ : 하나의 TX에서 어떤 데이터를 반복해서 읽어도 같은 데이터가 조회된다. NON-REPEATABLE READ를 허용하지 않는 레벨.

 (문제1) PHANTOM READ = 어떤 TX에서 쿼리 q를 반복 실행했을 때의 결과가 서로 다른 경우. 주로 통계, 분석용 쿼리 실행중에 자주 발생. 예를 들면 TX1: count(*) 쿼리 날림 → TX2: insert 쓰기, 커밋 → TX1: count(*) 쿼리 날림 (TX2 커밋 이전의 쿼리 결과와 다른 결과를 얻음)

 

- SERIALIZABLE : 가장 엄격한 레벨로 PHANTOM READ를 허용하지 않음.

앞서 언급한대로 동시성 처리 성능이 급격히 떨어질 수 있음.

 

 

대부분의 경우 동시성 처리 성능이 중요하기 때문에

보통 DB들은 READ COMMITTED 레벨을 기본으로 사용한다.

 

하지만 일부 중요한 로직에서는 DB에서 제공하는 Lock을 사용해

더 높은 레벨의 Isolation을 보장할 수 있다. (Lock은 별도로 다룬다) 

 

※ DB마다 Isolation level 동작 방식이 다르니 유의해야 한다.

 


+ Lock 보다 MVCC ?

DB에선 보다 더 나은 동시성 처리 성능을 위해 Lock 보다 MVCC를 사용한다고 한다.

 - https://en.wikipedia.org/wiki/Multiversion_concurrency_control

 - https://www.joinc.co.kr/w/man/12/MVCC

 

 

ref. 자바 ORM 표준 JPA 프로그래밍