Transaction 개념 정리

백엔드·2023년 8월 26일
0

들어가며

해당 강의를 보고 공부한 내용을 정리한 내용입니다.
mysql을 기준으로 작성된 글 입니다.

Transaction


개념

트랜잭션은 데이터베이스의 논리적인 작업 단위로서, 여러 개의 SQL 문들을 하나의 논리적 작업으로 묶어서 실행하며, 이 작업이 모두 성공적으로 수행된 경우에만 변경된 데이터를 영구적으로 저장하고, 그렇지 않은 경우에는 모든 변경을 취소하는 개념입니다. 트랜잭션은 데이터베이스의 일관성과 무결성을 유지하기 위해 중요한 개념 중 하나입니다.

COMMIT

트랜잭션이 성공적으로 수행되었을 때, 트랜잭션 내에서 수행한 모든 변경 사항을 데이터베이스에 영구적으로 저장하는 작업을 Commit이라고 합니다. 즉, 트랜잭션의 논리적 작업이 완료되었음을 데이터베이스에 알리는 역할을 합니다.

ROLLBACK

트랜잭션 중에 어떤 이유로든 문제가 발생하여 작업을 취소하고 이전 상태로 되돌리는 작업을 Rollback이라고 합니다. 트랜잭션 도중에 문제가 생긴 경우나 조건에 맞지 않아 작업을 취소해야 할 때 사용됩니다.

AUTOCOMMIT

Autocommit은 각각의 SQL 문을 실행할 때 자동으로 트랜잭션을 처리해주는 개념입니다. SQL 문이 성공적으로 실행되면 자동으로 Commit이 수행되며, 실행 중에 문제가 생기면 자동으로 Rollback이 수행됩니다. 대부분의 DBMS에서는 기본적으로 Autocommit이 활성화되어 있습니다.

그러나 Autocommit이 활성화되어 있는 경우, 각 SQL 문이 실행될 때마다 즉시 데이터베이스에 변경사항이 반영되므로, 하나의 작업에 여러 개의 SQL 문을 사용하는 경우 중간에 문제가 생기더라도 이미 수행된 작업은 롤백할 수 없게 됩니다.

AUTOCOMMIT 활성화 된 경우

insert문 실행 시, commit을 따로 입력하지 않아도 자동으로 commit 되기 때문에 데이터가 영구적으로 저장된다.

AUTOCOMMIT 비활성화 된 경우

autocommit을 비활성화 한 후, balance가 100000만원 이하인 row들을 모두 삭제하는 쿼리를 실행하였습니다.

이후 rollback을 진행한다면, autocommit을 비활성화하였기 때문에, commit이 안되었으므로 이전 상태로 돌아갈 수 있습니다.

autocommit with transaction

트랜잭션을 시작할 때 Autocommit이 비활성화됩니다. 트랜잭션이 Commit 또는 Rollback되면 Autocommit이 다시 활성화됩니다. 이렇게 함으로써 트랜잭션 내에서 여러 개의 작업을 묶어서 수행할 수 있고, 성공적으로 완료된 경우에만 변경 사항을 데이터베이스에 영구적으로 반영할 수 있습니다.

ACID


Atomicity

개념

ALL or NOTHING

트랜잭션의 Atomicity는 트랜잭션 내에서 수행한 작업들이 모두 성공하거나 모두 실패하는 원칙을 의미합니다. 즉, 트랜잭션 내부에 포함된 SQL 문들이 하나의 논리적인 작업 단위로서 쪼개지지 않으며, 트랜잭션 중간에 어떤 SQL 문이 실패하게 되면 이전에 수행된 모든 작업들이 취소되어 트랜잭션이 실행되기 전의 상태로 롤백됩니다.

역할

  • commit 실행 시 DB에 영구적으로 저장하는 것은 DBMS가 담당하는 부분이다.
  • rollback 실행 시 이전 상태로 되돌리는 것도 DBMS가 담당하는 부분이다.
  • 개발자는 언제 commit 하거나 rollback 할지를 챙겨야한다.

Consistency

개념

트랜잭션의 일관성은 데이터베이스의 상태를 변화시키는 작업을 통해 데이터베이스가 유효한 규칙을 항상 유지하는 것을 의미합니다. 즉, 트랜잭션을 수행하더라도 데이터베이스 내의 제약 조건, 규칙, 관계 등이 항상 지켜져야 한다는 원칙을 말합니다

예시

예를 들어, 어떤 계좌의 잔액이 음수가 될 수 없도록 데이터베이스의 제약 조건이 설정되어 있다고 가정해봅시다. 이 상황에서 J가 추가로 H에게 100만원을 입금하려고 한다면, 이 작업은 데이터베이스의 일관성을 위반하게 되므로 해당 트랜잭션은 실패해야 합니다

트랜잭션의 일관성을 유지하기 위해 DBMS는 제약 조건, 트리거 등을 활용하여 데이터베이스의 무결성을 보장합니다. 트랜잭션이 데이터베이스 내에 정의된 규칙을 위반하는 작업을 시도하면 DBMS는 해당 작업을 실패시키고, 롤백하여 데이터베이스의 일관성을 유지합니다.

일부 데이터베이스 무결성 규칙은 DBMS 자체에서 처리하겠지만, 어떤 규칙은 애플리케이션 레벨에서도 체크해야 합니다. 개발자는 트랜잭션을 수행하기 전에 데이터의 유효성을 검증하여 데이터베이스의 일관성을 지켜야 합니다.

Isolation

개념

트랜잭션의 Isolation(고립성)은 여러 트랜잭션이 동시에 실행될 때, 하나의 트랜잭션이 다른 트랜잭션의 연산에 영향을 미치지 않도록 보장하는 것을 말합니다. 다시 말해, 동시에 실행되는 트랜잭션들이 서로에게 영향을 주지 않고 독립적으로 실행되는 원칙입니다.

트랜잭션의 고립성을 보장하기 위해 DBMS는 여러 가지 격리 수준(Isolation Level)을 제공합니다.

개발자는 트랜잭션을 시작할 때 어떤 격리 수준을 선택할지 결정해야 합니다. 격리 수준은 트랜잭션의 동시성과 일관성을 조절하는 중요한 요소이며, 트랜잭션의 요구사항과 성능을 고려하여 적절한 격리 수준을 선택해야 합니다.

Duration

개념

Duration(지속성)은 트랜잭션이 성공적으로 완료되고 COMMIT된 후에 해당 변경 내용이 영구적으로 저장되는 것을 의미합니다. 즉, 데이터베이스 시스템에 문제가 발생하더라도 트랜잭션의 변경 내용은 손실되지 않고 복구 가능한 상태를 유지해야 합니다.

지속성은 트랜잭션이 HDD, SSD 등의 비휘발성 저장장치에 영구적으로 저장되는 것을 의미합니다. 데이터베이스 시스템은 트랜잭션의 COMMIT 후에 데이터의 변경 사항을 실제로 저장하고, 이를 복구 가능한 상태로 관리합니다.

지속성은 시스템의 문제나 장애가 발생하더라도 트랜잭션의 COMMIT된 내용을 보호하고 복구하기 위한 중요한 개념입니다. 시스템이 비정상적으로 종료되거나 데이터베이스 시스템에 문제가 생길 경우에도 데이터의 무결성을 유지하기 위해 지속성이 보장되어야 합니다.

profile
백엔드 개발자

0개의 댓글