Skip to content
(20) 거래
20.1. 거래
- DBMS의 논리 연산 단위.
- 더 이상 세분화할 수 없는 작업 단위
- 나눌 수 없는 가장 작은 단위
- 모두 적용하거나 모두 취소합니다.
- 트랜잭션은 ALL 또는 NOTHING 개념입니다.
- INSERT, UPDATE, SELECT 및 DELETE는 각각 트랜잭션에 해당합니다.
- 트랜잭션에는 하나 이상의 SQL 문이 포함됩니다.
- 데이터베이스를 읽거나 쓰기 위해서는 여러 쿼리가 필요합니다.
- 예를 들어, 이체를 할 때 한 계좌에서 인출할 때 다른 계좌로의 입금이 확인되는 것이 중요합니다.
- 출금(UPDATE) -> 자금 -> 입금(UPDATE)은 반드시 하나의 Tx에 묶어야 합니다.
- 쿼리가 실패하면 DBMS는 전체 트랜잭션 또는 실패한 쿼리를 롤백합니다.
- 개발 방식에 따라 다를 수 있습니다.
- ‘Mo’ 또는 ‘Do'(둘 다 성공, 하나만 실패하면 중단됨)
- 커밋하기 전에 언제든지 트랜잭션을 수동으로 롤백할 수 있습니다.
- AOP와 유사합니다.
20.2. 4 거래의 특성(ACID)
- 원자성
- 분리할 수 없는 하나의 작업으로 취급해야 합니다.
- 트랜잭션에 정의된 작업은 모두 성공적으로 완료되거나 모두 실패해야 합니다.
- COMMIT: 운영 프로세스에 문제가 없으면 프로세스를 커밋합니다. 작업을 DB에 영구적으로 저장합니다.
- ROLLBACK: 작업 중 문제가 발생하면 마지막 커밋으로 돌아갑니다. 최근 변경 사항을 취소합니다.
- 일관성
- 트랜잭션이 실행되기 전에 데이터베이스의 내용이 잘못되지 않았다면 실행 후에도 데이터베이스의 내용이 잘못되지 않아야 합니다.
- 데이터 조작 전후에 일관성을 유지하는 것이 필요합니다.
- Tx를 수행하기 전과 후에 일관된 상태를 유지해야 합니다.
- 예) 회원가입 시 등록번호 고유성 제한 설정
- 절연(격리)
- 각 Tx는 독립적으로 수행되어야 합니다.
- 여러 사용자가 동시에 데이터 조작을 수행할 때 각 작업이 모순 없이 실행되도록 보장됩니다.
- 데이터베이스 개체를 잠가 후속 처리를 차단합니다.
- 격리 수준이 너무 높으면 다른 작업자가 기다려야 합니다.
- 직렬화 가능 기능(직렬 상태에서 여러 트랜잭션을 순차적으로 처리)
- DBMS 내에서 트랜잭션 격리 수준을 설정하여 구현됩니다.
- 트랜잭션이 진행되는 동안 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어내지 않아야 합니다.
- 내구성
- 즉, 데이터 조작이 완료된 후 완료 알림을 받을 때까지 결과가 손실되지 않습니다.
- 트랜잭션이 커밋되면 데이터 변경 사항이 영구적으로 커밋됩니다.
20.3. 저지르다
- 입력된 데이터, 수정된 데이터, 삭제된 데이터에 문제가 없다고 판단되면 COMMIT 명령으로 트랜잭션을 완료할 수 있습니다.
- COMMIT 또는 ROLLBACK 이전의 데이터 상태
- 메모리 버퍼만 영향을 받기 때문에 변경 전의 상태로 데이터를 롤백할 수 있습니다.
- 현재 사용자는 SELECT 문을 이용하여 결과를 확인할 수 있습니다.
- 다른 사용자는 현재 사용자가 실행한 명령의 결과를 볼 수 없습니다.
- 변경된 행은 다른 사용자가 변경할 수 없도록 잠깁니다.
- 커밋 후 상태
- 데이터 변경 사항은 데이터베이스에 반영됩니다.
- 이전 데이터는 영원히 손실됩니다.
- 모든 사용자가 결과를 볼 수 있습니다.
- 연관된 행이 잠금 해제되어 다른 사용자가 행을 편집할 수 있습니다.
20.4. 기본값으로 재설정
- 테이블에 입력, 수정 또는 삭제된 데이터에 대해 COMMIT 전에 변경 사항을 되돌릴 수 있습니다.
- 데이터베이스는 ROLLBACK 함수를 사용합니다.
- 데이터 수정이 취소되고 데이터가 이전 상태로 복원되며 연결된 행의 잠금이 해제되어 다른 사용자가 데이터를 수정할 수 있습니다.
20.5. 세이브 포인트
- 저장점을 정의하면 롤백할 때 트랜잭션과 관련된 모든 작업을 롤백하는 대신 현재 시간부터 트랜잭션의 일부만 SAVEPOINT로 롤백할 수 있습니다.
- 복잡하고 큰 트랜잭션에서 오류가 발생하면 해당 트랜잭션만 SAVEPOINT로 롤백하고 실패한 부분만 재실행한다.
20.6. 자동 커밋, 수동 커밋
- 자동 커밋이 기본값입니다.
- 자동 커밋 – 명령 실행 후 자동 커밋 수행(롤백 불가)
- 수동 커밋 – 명령을 실행한 후 COMMIT 또는 ROLLBACK을 명시적으로 실행합니다.
20.7. Tx의 격리 수준
- 각 Tx의 격리 수준을 나타냅니다.
- 자유롭게 읽기
- 커밋되지 않은 데이터도 읽을 수 있습니다.
- 다른 트랜잭션이 트랜잭션에서 처리 중인 커밋되지 않은 데이터를 읽을 수 있도록 합니다.
- 가장 낮은 격리 수준
- 읽기 의무
- 커밋된 데이터만 읽을 수 있음(팬텀 읽기)
- 다른 트랜잭션이 트랜잭션이 커밋한 데이터만 읽을 수 있도록 허용합니다.
- 반복 읽기
- 반복 읽기, Tx 시작 후 변경 사항은 무시됩니다.
- 트랜잭션 내에서 쿼리가 두 번 이상 실행되면 첫 번째 쿼리의 레코드가 사라지거나 값이 변경되지 않습니다.
- 직렬화 가능
- 한 번에 하나의 Tx만 독립적으로 실행됩니다.
- 직렬화가 많을수록 성능은 낮아지고 품질은 높아집니다.
- DBMS를 실행할 때 동시성이 크게 떨어져 성능 문제가 발생합니다.
- 가장 이상적인 격리 수준 보장
20.8. 트랜잭션 포인트
- COMMIT 및 ROLLBACK의 목적은 테이블의 데이터 변경을 유발하는 삽입(INSERT), 업데이트(UPDATE) 및 삭제(DELETE) 중에 변경된 데이터의 무결성을 보장하는 것입니다.
- Commit은 “변경된 데이터를 테이블에 영구적으로 반영한다”는 의미를 가지고 있습니다.
- 롤백은 “변경 전으로 돌아가기”를 의미합니다.
- SAVEPOINT는 “미리 정의된 저장 지점까지만 데이터 변경 취소”를 의미합니다.
- 트랜잭션의 대상이 되는 SQL 문이 실행될 때 자동으로 시작되고 커밋 또는 롤백이 발생하면 종료됩니다.