# 트랜잭션 특성 (ACID)

    - 원자성(Atomicity) : 트랜잭션 내의 연산들이 완전히 완료되거나 어떠한 것도 수행되지 않은 원자성을 가진다는 의미

    - 일관성(Consistency) : 트랜잭션이 완료되면 언제나 일관성있는 상태로 유지

    - 고립성(Isolation) : 트랜잭션 수행시 다른 트랜잭션에 영향줘도 안되고 간섭받아도 안되는 것

    - 지속성(Durability) : 완료된 트랜잭션은 영원히 유지되어야 함

 

 

트랜잭션 격리수준을 알아보기 전에 간단한 용어를 먼저 짚고 넘어간다.

 

Dirty read : A세션에서 commit되지 않은 변경된 데이터(dirty page)를 B세션에서 select할수있는것

non-repeatable read : 한 트랜잭션 내에서 동일한 select쿼리에 대해 여러번 수행했을 때 서로 다른 결과가 출력되는 현상

phantom read : A세션에서 여러번 select 할 때, B세션에서 INSERT한 데이터가 A세션에서 갑자기 보이거나, B세션에서 DELETE한 데이터가 A세션에서 갑자기 사라지는 상황

 

# 트랜잭션 격리수준 (MySQL) 

READ UNCOMMITED

커밋되지 않은 데이터를 다른 세션에서 읽을 수 있다

- Dirty Read, non-repeatable Read, Pantom Read 발생

- 무결성이 가장 안좋고, 동시성이 보장된다.

- 주로 데이터가 쌓이기만하는 로그성 데이터 (lock이없으니까 insert가엄청빠름) 에서 쓴다.

READ COMMITTED

커밋된 데이터만 읽을 수 있다.

- non-repeatable Read, Phantom read 발생

- 아직 커밋이 안된 경우, 다른 트랜잭션은 Undo 영역에 있는 '변경전데이터'를 보여준다.

- row 기반의 binlog_format만 지원되고, mixed로 한 경우 자동으로 row기반의 로깅을 사용한다. (by.레퍼런스)

 

REPEATABLE READ

동일 트랜잭션 내에서 읽은 데이터는 트랜잭션 종료 시까지 같은 결과를 반복적으로 읽을 수 있다.

- 트랜잭션을 시작하고 첫 SELECT를 수행했을 때의 스냅샷을 가지고 트랜잭션 종료될 때까지 동일한 결과를 보여준다.

- Phantom read 발생 (InnoDB 스토리지 엔진에서는 특별한 케이스가 아닌 경우, phantom read가 발생하지 않는다. by.Realmysql)

- MySQL 의 InnoDB 엔진에서 기본적으로 사용되는 격리수준이다.

- BEGIN으로 트랜잭션을 시작하고 장시간동안 트랜잭션을 종료하지 않으면, 언두영역의 백업된 데이터로 무한정 커져서 시스템 테이블스페이스의 IO가 유발될 수 있다.

SERIALIZABLE

한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없다

- 읽기 작업도 shared lock(read lock)을 획득해야 한다. (원래 InnoDB는 '잠금 필요없는 일관된읽기'가 가능)

- 가장 높은 무결성이 보장되지만, 동시성과 성능은 좋지 않다.

 

https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

Print Friendly and PDF Posted by JJ*
: