5. 트랜잭션과 회복
1. 트랜잭션과 ACID
1) 세션과 커넥션
세션은 사용자가 DB 서버에서 작업하는 논리적인 단위를 말합니다. 다시 말해, 데이터베이스를 사용하기 시작하고, 종료하기까지의 작업 상태를 저장하는 반영구적인 컨테이너라고 할 수 있습니다. 따라서 세션 내에서 사용자의 트랜잭션, 쿼리 등의 작업이 이루어지며, 로그아웃을 할 경우, 세션도 종료됩니다. 또한, 세션은 로그인 된 캐시 데이터, 트랜잭션 격리 수준 데이터 등을 저장합니다.
커넥션과 세션의 차이점은?
커넥션은 사용자와 DB 서버가 통신하기 위해 필요한 물리적인 연결 상태를 의미합니다. 신뢰성을 보장하는 TCP 기반이기 때문에 DB에 요청을 보내기 전후로 커넥션이 열고 닫혀야 합니다. 따라서 세션은 커넥션을 통해 생성되며, 커넥션이 물리적인 연결을, 세션은 논리적인 연결을 의미합니다.
// DB 커넥션 생성
Connection connection = DriverManager.getConnection(url, username, password);
// 세션 시작 (트랜잭션 시작)
connection.setAutoCommit(false);
try {
// 세션 내에서 여러 작업 수행
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users VALUES (1, 'John')");
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// 세션 종료 (트랜잭션 커밋)
connection.commit();
} catch (SQLException e) {
// 문제 발생 시 롤백
connection.rollback();
} finally {
// 커넥션 반환
connection.close();
}
2) 커밋과 롤백
커밋과 롤백은 트랜잭션에서 반드시 필요한 기능입니다. 커밋은 트랜잭션을 종료하고, 특정 세션에서 변경한 사항이 다른 세션에서도 보이도록 변경 사항을 확정하는 명령어입니다. 따라서 커밋을 사용하기 전에는 임시로 데이터가 변경되는 것이며, 이는 해당 트랜잭션을 사용하는 세션에서만 보입니다.
롤백은 세션에서의 변경 사항이 트랜잭션이 시작되기 전 상태로 돌리는 명령어입니다. 이 롤백을 활용하여 특정 세션에서의 트랜잭션에 오류가 발생하더라도 다시 원래대로 복구할 수 있기 때문에 데이터베이스의 무결성을 지키기 위해 필요한 기술입니다.
자동 커밋과 수동 커밋
커밋은 크게 자동 커밋과 수동 커밋으로 분류됩니다. 자동 커밋은 SET AUTOCOMMIT = 1 로 활성화하며, 쿼리가 실행되는 즉시 커밋이 됩니다. 이는 일일이 커밋을 하지 않아도 되지만, 사용자가 원하는 트랜잭션 범위를 지정하기 어렵습니다.
수동 커밋은 사용자가 commit or rollback 명령어를 통해서만 변경사항이 확정됩니다. 따라서 수동 커밋으로 설정함으로써 사용자가 원하는 트랜잭션 범위를 지정할 수 있습니다. 수동 커밋으로 설정하는 것을 트랜잭션이 시작된다고 표현할 수 있습니다.
3) 트랜잭션이란
트랜잭션은 한 개 혹은 여러 개의 쿼리가 하나의 논리적인 집합으로 실행될 때, 전부 적용되거나 전부 적용되지 않도록 하는 것을 보장해주는 기술입니다. 이는 커밋과 롤백을 통해 가능한 기술입니다. 따라서 트랜잭션은 작업 수행에 필요한 쿼리문의 모임이라고 말할 수 있습니다.
- 만약, 특정 상품에 대한 주문 연산을 처리하는 트랜잭션이라면, 주문 데이터 추가와 주문한 상품의 재고를 변경하는 작업이 하나의 트랜잭션으로 묶음으로써 도중에 한 작업에 오류가 발생하더라도 롤백을 통해 이전 상태로 되돌릴 수 있습니다.
- MySQL의 경우, MyISAM 스토리지 엔진은 트랜잭션이 지원되지 않으나, InnoDB 스토리지 엔진은 트랜잭션을 지원합니다.
4) 트랜잭션의 ACID란
ACID는 트랜잭션이 성공적으로 처리되어 데이터가 일관되고 무결한 상태를 유지하기 위해 만족해야 하는 특성을 말합니다.
Atomicity, 원자성
트랜잭션을 구성하는 모든 연산들(쿼리문)이 모두 실행되거나 모두 실행되지 않는 all-or-nothing 방식을 의미합니다. 이러한 원자성 덕분에 트랜잭션에서의 작업 중 특정 연산만 반영되는 문제가 발생하지 않습니다.
Consistency, 일관성
트랜잭션이 시작되기 전후로 데이터베이스가 일관된 상태를 유지해야 함을 의미합니다. 트랜잭션 전후로 데이터베이스의 상태가 변경되었을 수 있습니다. 만약, 트랜잭션으로 인해 A에서 A`으로 변했더라도, 각각은 트랜잭션 전후로 A 또는 A`라는 일관된 상태를 유지해야 합니다.
다음과 같이, 트랜잭션이 진행되기 전과 후의 상태(성호와 은경의 잔액)가 다르다는 것을 알 수 있습니다. 하지만, 트랜잭션이 일관성을 갖게 될 경우, 전후의 상태가 다르더라도 모순된 데이터가 존재하지 않습니다.
Isolation, 격리성
여러 트랜잭션이 동시에 실행될 때, 트랜잭션의 작업 도중에 다른 트랜잭션이 개입하지 않도록 하는 특성을 말합니다. 트랜잭션이 실행되는 과정에서는 데이터베이스가 일관되지 않은 상태일 수 있으므로, 도중에 다른 트랜잭션이 개입할 경우, 데이터베이스의 일관성이 완전히 깨질 수 있습니다. 따라서 트랜잭션이 격리성을 만족함으로써 여러 트랜잭션이 동시에 실행되는 것처럼 보이더라도 각 트랜잭션이 순차적으로 실행되어 무결하고 일관된 데이터 상태를 보장할 수 있습니다.
Durability, 지속성
트랜잭션이 완료됨으로써 변경된 내용이 데이터베이스에 영구적이고 손실되지 않아야 함을 의미합니다. 즉, 시스템에 장애가 발생하더라도 트랜잭션의 결과가 데이터베이스에 남아있어야 합니다. 이러한 지속성을 보장하기 위해서 데이터베이스가 시스템 장애 발생 후에도 원래 상태로 돌아갈 수 있는 회복 기능이 필요합니다.
데이터베이스는 이러한 지속성을 보장하기 위해 트랜잭션의 변경사항이 WAL(Write Ahead Logging) 방식으로 디스크에 저장됩니다. 이처럼 영구적인 디스크에 저장되기 때문에 트랜잭션 진행 중에 시스템에 장애가 발생하더라도 디스크에 저장된 로그를 통해 어느 시점에서 장애가 발생했는지를 파악하고, 원래의 상태로 되돌릴 수 있습니다.
참고 자료:
세션이란게 구체적으로 무엇인가요? - 인프런 | 커뮤니티 질문&답변
누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.
www.inflearn.com
스프링 DB 1편 - 데이터 접근 핵심 원리 강의 | 김영한 - 인프런
김영한 | 백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니
www.inflearn.com
트랜잭션의 개념
데이터베이스는 다수의 사용자가 동시에 사용하더라도 항상 모순이 없는 정확한 데이터를 유지해야 한다. 그리고 데이터베이스에 장애가 발생하더라도 빠른 시간 내에 원래의 상태로 복구할
terms.naver.com