Search
Duplicate
📒

[Database Study] 03-1. 트랜잭션 이해와 사용법

상태
완료
수업
Database Study
주제
Transaction
연관 노트
3 more properties
참고

트랜잭션

NOTE
트랜잭션(Transaction)이란 ‘쪼갤 수 없는 업무 처리의 최소 단위’ 를 의미합니다.
트랜잭션 흐름도
TRANSACTION BEGIN; -- 트랜잭션을 시작한다. -- 쿼리 내용 ~~ TRANSACTION COMMIT; -- 실제로 디스크에 반영한다. TRANSACTION ROLLBACK -- 모든 변경사항을 취소한다.
SQL
복사
Transaction 로직
SET autocommit TRUE -- 자동 커밋 모드 설정 SET autocommit FALSE -- 수동 커밋 모드 설정
SQL
복사
Transaction은 기본적으로 자동 커밋 모드이다.
자바와 같은 SQL이 아닌 애플리케이션에서는 트랜잭션이 하나의 Connection을 가져와 사용하고 닫는 과정에서 발생합니다.
트랜잭션의 종료는 Connection 객체를 통해 이루어지며, JDBC의 기본 설정은 DB 작업 수행 직후 commit하는 auto commit 모드가 활성화되어 있습니다.
public static void main(String[] args) { Connection conn = null; String url = "~~"; // DB URL String username = "~~"; // DB 유저이름 String password = "~~"; // DB 패스워드 try{ // 데이터베이스 연결 설정 DriverManager.getConnection(url, username, password); // 자동 커밋 활성화 conn.setAutoCommit(false); Statement stmt = conn.createStatement(); stmt.executeUpdate("~~"); // SQL 쿼리 stmt.executeUpdate("~~"); // SQL 쿼리 // 작업이 성공하면 커밋 conn.commit(); }catch (SQLException e){ if(conn != null){ try{ conn.rollback(); } catch (SQLException ex){ ex.printStackTrace(); } } e.printStackTrace(); } finally { if(conn != null){ try{ conn.close(); }catch (SQLException ex){ ex.printStackTrace(); } } } }
Java
복사

트랜잭션 ACID

NOTE
트랜잭션은 ACID 속성은 트랜잭션이 데이터의 무결성과 일관성을 지키기 위해 갖추어야할 4가지 기본 특성을 나타냅니다.

원자성(Atomicity)

원자성은 트랜잭션이 완료되면, 모든 작업이 모두 성공/실패 하도록 만들어야 한다는 원칙입니다.
트랜잭션 도중 문제가 생겨 중단된다면, 원자성으로 인해 이미 수행된 작업도 ROLLBACK되어야 합니다.

일관성(Consistency)

일관성은 DBMS에서 데이터가 조회/수정시에 일관성을 보장하는 방법을 말합니다.
데이터 일관성은 저장된 데이터가 데이터 모델이 무결성을 유지하는것을 말하며, 주로 참조 무결성을 통해 보장됩니다.
읽기 일관성은 여러 DB 복제본이 있을때 읽는 시점에 따라 데이터가 다른것을 방지하며, 비동기 복제동기 복제 방식이 있습니다.
동기 복제: 모든 복제본에 쓰기 작업이 완료될때까지 트랜잭션을 유지해 성능이 떨어질 수 있습니다.
비동기 복제: 성능을 높이기 위해 쓰기 작업을 즉시 반영하지 않고, 일시적으로 일관성이 깨지지만 최종적으로는 일관된 상태로 도달합니다.

격리성(Isolation)

격리성은 여러 트랜잭션이 동시에 실행될 때, 한 트랜잭션이 다른 트랜잭션의 중간 상태를 볼 수 있는지 여부를 결정합니다. 격리성이 없다면 여러 트랜잭션이 동일한 데이터를 동시에 조회/수정 하면서 일관성이 깨질 수 있습니다.
격리성이 깨지는 경우 읽기 현상(Read Phenomenon)이 발생하며 이를 해결하기 위해 트랜잭션의 격리 수준을 사용할 수 있습니다.
DBMS별로 격리성을 다양하게 구현하고 있으며, 비관적/낙관적 제어나 PostgreSQL의 경우 격리 수준을 스냅샷으로 격리하기도 합니다.

지속성(Durability)

지속성은 트랜잭션이 커밋된 후 데이터가 디스크에 영구적으로 저장되어, 시스템이 꺼지더라도 데이터 손실이 발생하지 않음을 보장하는 것입니다.
지속성을 보장하는 것은 매우 중요하지만, 디스크에 데이터를 기록하는 과정은 메모리에 기록하는것보다 느리므로 일부 데이터베이스는 지속성을 희생해 속도를 올리는 옵션을 제공합니다.
WAL(Write-Ahead Log): WAL은 트랜잭션에서 발생한 변경 사항을 로그로 기록하고, 이 로그를 디스크에 먼저 기록한 후, 실제 데이터 파일에 변경을 반영하는 방식입니다.
비동기 스냅샷: 변경 사항을 메모리에 유지한 후, 주기적으로 디스크에 스냅샷을 생성하여 저장하는 방식입니다. 주로 Redis에서 쓰이는 방식입니다.

트랜잭션 격리수준 - Isolation level

NOTE
격리 수준은 DBMS에서 트랜잭션이 독립적으로 실행되도록 보방하는 정도를 나타내며, 격리 수준에 따라 다른 트랜잭션의 중간 상태를 볼 수 있는지 여부가 결정됩니다.
BEGIN TRANSACTION; -- READ COMMITED(기본) BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; COMMIT; ROLLBACK;
SQL
복사

READ UNCOMMITED

트랜잭션이 다른 트랜잭션이 COMMIT되지 않은 데이터를 읽을 수 있는 가장 낮은 격리 수준입니다.
Dirty Read 상황
모든 읽기 현상 문제가 발생할 수 있습니다.

READ COMMITTED

트랜잭션이 다른 트랜잭션에서 COMMIT된 데이터만 읽을 수 있습니다. 대부분의 DBMS에서 기본 격리수준으로 사용됩니다.
Lost UPDATE 상황
Non-repetable reads 상황

REPEATABLE READ

트랜잭션이 처음 데이터를 읽은 이후 해당 트랜잭션이 완료될 떄까지 다른 트랜잭션이 그 데이터를 변경할 수 없도록 보장합니다.
Read Phantoms 상황

SERIALIZABLE (직렬화 가능)

가장 높은 격리 수준으로, 트랜잭션이 순차적으로 실행되도록 보장합니다.
SERIALIZABLE 실행과정
READ COMMITEDNON-REPETABLE 격리수준은 Row단위에서의 독립적인 작업을 보장하지만, SERIALIZABLE의 경우에는 테이블 단위의 독립적인 작업을 보장합니다.

Eventual Consistency(최종적 일관성)

NOTE
최종적 일관성은 분산 시스템에서 사용되는 데이터 일관성 모델 중 하나로, 데이터가 일시적으로 일관되지 않을 수 있지만, 시간이 지나면 모든 복제본이 최종 상태에 도달하게 되는 것을 의미합니다.
비동기 동기화
분산 시스템에서 여러 노드에 저장될 때, 즉시 일관성을 유지하기 위한 오버헤드를 줄일 수 있습니다.
일시적으로 일관되지 않은 데이터를 볼 수 있으며, 개발자가 해당 모델을 고려해서 시스템을 설계해야해 추가적인 로직이 필요할 수 있습니다.