트랜잭션(Transaction)이란?
트랜잭션은 하나의 데이터 교환 또는 변경을 안전하게 처리하도록 보장해 주는 것을 의미한다. 한 번의 애플리케이션 로직으로 인해 두 개 이상의 데이터가 영향을 받는 경우, 각각의 데이터에 대한 변경이 완전하게 끝난 후 데이터베이스에 정상적으로 반영하는 것이다. 만약 데이터 처리 중 문제가 발생 시 로직 실행 전으로 되돌리는 기능을 지원한다.
데이터베이스에 정상적으로 반영하는 것을 커밋(Commit) , 되돌리는 것을 롤백(Rollback)이라고 한다.
트랜잭션 ACID 속성
ACID는 트랜잭션을 정의하는 4가지 중대한 속성을 가리키는 약어입니다.
즉 원자성, 일관성, 신뢰성, 격리 그리고 영속성을 의미합니다.
원자성(Atomicity)
트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.
모두 성공 시에는 커밋을, 하나라도 실패 시 롤백해야 한다.
일관성(Consistency)
모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다.
예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
격리성(Isolation)
동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.
예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.
영속성(Durability)
트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다.
중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션 동작 원리 (데이터베이스 연결 구조)
Connection
사용자는 WAS, DB 접근 툴 등의 클라이언트를 사용해서 DB 서버에 접근할 수 있다. 그러면 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺는다.
이때, 데이터베이스 서버는 내부에 세션을 만들어서 세션을 통해 커넥션을 통한 요청을 실행하게 된다.
하나의 세션
트랜잭션 기능을 사용 시, 세션 내에서 동작한다. 하나의 세션 내에서 커밋, 롤백을 하고 세션을 종료하는 것이다.
- 커밋을 한다면 세션 종료 후 데이터베이스에 결과가 반영되는 것이고,
- 롤백을 한다면 세션 시작 이전으로 되돌리는 것이다.
덕분에 하나의 세션에서 트랜잭션 진행 중에 다른 커넥션 또는 세션을 통해 해당 데이터에 접근 시 세션 시작 이전의 데이터만 볼 수 있는 것이다.
트랜잭션 과정 (DB)
1. 자동커밋 해제
기본적으로 데이터베이스는 자동커밋으로 설정되어 있다. 즉, 쿼리 실행 시 즉각적으로 데이터베이스에 반영되는 것이다.
트랜잭션은 즉각적으로 반영되지 않도록 하는 것이기 때문에, 자동 커밋을 해제하고 수동 커밋 모드로 변경하는 것이 트랜잭션의 시작이라고 보면 된다.
set autocommit false; // 수동커밋 모드로 설정
# set autocommit true; //자동 커밋 모드로 설정
2. 쿼리 실행
수동커밋 모드로 변경 후 쿼리를 실행한다. 이때 실행한 쿼리는 해당 세션 내에서만 동작한 것이다. 따라서 다른 세션에서 데이터베이스를 조회했을 때는 쿼리 실행 전의 상태를 볼 수 있다.
UPDATE user SET money=money-1000 WHERE user_id='userA';
UPDATE user SET money=money+1000 WHERE user_id='userB';
userA의 계좌에서 돈 1000원을 userB의 계좌로 입금한다고 생각해 보자. userA의 돈이 -1000원 됨과 동시에 userB의 돈이 +1000원이 되어야 할 것이다. 이 과정에서 오류 발생 시 예를 들어 userA의 돈은 -1000원이 되었는데 userB의 돈은 +1000원이 되지 않는 오류가 발생할 수 있다. 이런 문제를 해결하기 위해 트랜잭션 개념이 도입된 것이다.
3. 커밋, 롤백
만약 문제없이 두 개의 쿼리가 실행되었다면 커밋을,
문제가 발생했다면 롤백을 해야 할 것이다.
#성공 시
commit;
#실패 시
rollback;
트랜잭션 관련 글
📁[Database] 트랜잭션의 동작 원리와 ACID 속성
📁[Database] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정
📁[Java, Spring] 트랜잭션을 적용하는 여러 가지 방법
📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
📁[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read
(참고) 인프런 - 김영한 님 스프링 DB 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1#
'Database > 데이터베이스 이론' 카테고리의 다른 글
[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read (0) | 2024.03.19 |
---|---|
[DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정 (0) | 2024.03.19 |