트랜잭션과 락

Gunjoo Ahn·2023년 10월 15일
0
post-custom-banner

트랜잭션과 격리 수준

트랜잭션

데이터베이스에서 트랜잭션이란 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위이다.

트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.

Atomicity

트랜잭션은 나눌 수 없는 하나의 작업이라는 특징이다.

All or Nothing

트랜잭션이 중간에 문제가 생기면 없던 일로 DB에 반영하지 않는다.

Consistency

트랜잭션의 작업 처리로 인하여 데이터베이스 상태의 일관성이 어긋나서는 안된다. 예를 들어, 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.

Isolation

동시에 실행하는 트랜잭션끼리는 서로에게 영향을 미치지 않도록 격리한다. 다른 트랜잭션과 동시에 실행했더라도 동시에 같은 데이터를 수정하지 못하도록 해야 한다.

단, 격리 수준은 동시성과 관련된 성능 이슈로 인하여 DBMS에 따라서 옵션으로 어느정도 격리시킬지 격리 수준은 정할 수 있다.

Durability

트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제(물리적으로 전원이 꺼지는 상황 등..)가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다.

즉, COMMIT한 데이터 영구적으로 반영되어야하며, 어떤 문제가 생기더라도 복구할 수 있어야 한다.

격리 수준

트랜잭션의 격리성을 보장하기 위해서는 트랜잭션을 거의 차례대로 실행해야 한다. 병렬 처리를 거의 할 수 없어 동시성 처리 성능이 매우 나빠진다. 이런 문제로 인하여 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의했다.

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
Read UncommittedOOO
Read CommittedOO
Repeatable ReadO
Serializable

Dirty Read

A 트랜잭션에서 작업이 다 끝나지 않았지만 다른 트랜잭션에서 A 트랜잭션의 작업 내용을 볼 수 있는 것

Non-Repeatable Read

하나의 트랜잭션에서 두번의 동일한 조회를 하였을 때, 다른 트랜잭션의 커밋으로 인하여 서로 다른 결과가 조회되는 것

Phantom Read

하나의 트랜잭션에서 두번의 동일한 조회를 하였을 때, 다른 트랜잭션의 Insert로 인해 없던 데이터가 조회되는 것

Read Uncommitted

트랜잭션이 커밋하지 않은 내용까지 읽겠다는 격리 수준으로 Dirty Read, Non-Repeatable Read, Phatom Read의 문제를 모두 가지고 있다.

Read Committed

트랜잭션이 커밋한 내용은 모두 읽겠다는 격리 수준으로 반복 조회를 하는 순간 문제가 생긴다. Non-Repeatable Read, Phantom Read 문제를 가지고 있다.

Repeatable Read

반복 조회시 다른 트랜잭션에 의하여 변경된 사항을 읽지 않겠다는 것이다. 다만 다른 트랜잭션에 의하여 추가된 사항은 반복 조회를 통해 조회될 수 있다. 즉, Phantom Read 문제가 있다.

Serializable

모든 트랜잭션을 순서대로 실행하겠다는 것이다. 하나의 한 트랜잭션만 실행하므로 어떤 문제도 발생하지 않으나 성능이 급격하게 떨어진다.

어플리케이션 대부분은 동시성 처리가 중요하므로 데이터베이스들은 보통 Read Committed 격리 수준을 기본으로 사용한다.

Reference

https://velog.io/@hyunjong96/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80Isolation-level
자바 ORM 표준 JPA 프로그래밍 16장

profile
Backend Developer
post-custom-banner

0개의 댓글