본문 바로가기
JAVA공부/4-트렌젝션

3. 트랜젝션 격리 수준(Transaction Isolation Level)

by 으노으뇨 2024. 10. 30.
728x90
반응형
SMALL

데이터베이스 환경에서는 일반적으로 Single 유저가 아니라 Multy User환경을 지원하기 한다.

여러명은 동시에 같은 데이터를 읽거나 삽입, 수정하는 일이 생긴다. 

이 과정에서 데이터의 일관성(Consistency)와 동시성(Concurrency)를 보장해 주어야 한다.

  • Data Consistency 어느 사용자가 데이터를 엑세스 하던간에 같은 데이터를 볼 수 있는 속성
  • Data Concurrency 동시에 여러 사용자가 같은 데이터를 엑세스 할 수 있는 속성
1. 트랜잭션 A와 B가 동시에 시작
2. A에서 select user Table를 통해 unoKim을 검색한다. 이때 이메일은 unoKim@naver.com이다.
3. B에서 user Table 수정을한다. 아이디가 unoKim인 계정의 이메일을 123@naver.com 으로 수정한다.
4. A에서 다시 unoKim을 검색한다.
5. B에서 Commit 
6. A에서 또다시 unoKim을 검색한다.

이 과정에서 4번과 6번 중에 123@naver.com 로 변경된 채로 결과를 얻을 수 있는 규칙을 정하는 것이 트랜젝션 격리수준이다.


Preventable Phenomena

서로 다른 트랜젝션에 대해 어떻게 영향을 주느냐는 3가지 가 있다.

Dirty Read

어떤 트랜젝션이 데이터를 변경하고, Commit을 하지 않았을 때에도 다른 트랜젝션에서 그 값을 읽으면 변경된 값이 반영되는 경우다.

A가 시작되고 검색을 했다고 가정한다.
B에서 수정을 한다.
A에서 는 123@naver.com가 검색된다.

즉 수정한 내용을 Commit하지 않아도 반영된 것이 검색되는 걸 Dirty Read라고 한다.

NonRepeatable Read (Fuzzy Read)

어떤 트랜젝션이 데이터를 변경 (update, delete) 하고, Commit을 하면, Commit된 내용은 다른 트랜젝션에 반영된다.

-insert는 반영되지 않는다.

A가 시작되고 검색한다면 우선은 unoKim@naver.com가 검색된다.
B의 수정문이 실행된다.
A에서 검색을 한다. 그럼 unoKim@naver.com이 검색된다.
B에서 Commit을 때린다.
A에거 재검색을 한다. 그럼 123@naver.com이 검색된다.

Phantom Read

어떤 트랜젝션이 새로운 데이터를 추가(insert) 하고 Commit을 하면 Commit한 내용은 다른 트랜젝션에 반영된다.

이건 NonRepeatable Read와 같으나,

NonRepeatable는 update, delete가, Phantom Read는 insert된 내용이 반영된다.

A가 시작되고 Select Count(*) 를 통해 사용자 인원을 검색한다. 2명이다.
B가 신규 계정을 Insert한다. hohoKim@naver.com
A가 계정을 검색하니 2명이 뜬다.
B에서 Commit을 친다.
A에서 Count(*)을 인원을 검색하니 3명이 뜬다. 

Isolation Level

ANSI/ISO SQL 표준 (SQL92)에서는 4가지 Isolation Level을 지원하는데, 그 내용은 간단하게 다음과 같다.

Isolation Level Dirty Read NonRepeatable Read Phantom Read
Read uncommitted 가능 가능 가능
Read committed 불가능 가능 가능
Repeatable read
불가능 불가능 가능
Serializable 불가능 불가능 불가능

오라클과 자바에서의 단계

많이 사용하고 있는 Oracle DBMS의 경우 Default가 Read Commited 로 설정되어있다.

Oracle9 버전 기준으로는 Isolation Level은 Read commited, Serializable 두가지를 지원하고 있다.

SET TRANSACTION ISOLATION LEVEL READ COMMITED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Java에서도 데이터 베이스 Isolation Level에 따라 알맞는 Isolation Level을 지정해 줄 수 있다.

Connection conn = DriverManager.getConnection(url, uid, pwd);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITED);
System.out.println(conn.getTransactionIsolation());
728x90
반응형
LIST

'JAVA공부 > 4-트렌젝션' 카테고리의 다른 글

2. 분산 트렌젝션(Distributed Transaction)  (0) 2024.10.29
1. 트렌젝션이란 무엇인가?  (0) 2024.10.28

댓글