정의
트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.
// 트랜잭션 시작
BEGIN TRAN
//변경할 쿼리문
UPDATE tbl_admin
SET nickname = "babo"
WHERE no= 1;
//결과 확인해 본 후
select * from tbl_admin
//성공 처리
COMMIT TRAN
//실패 처리
ROLLBACK TRAN
이론공부만 하던 시절에는 와닿지 않았던 개념이었는데, 현업에서 사용하게 되어서 CS의 주제로 선정하게 되었다.
위의 쿼리문 처럼 변경을 시작하기 전에 " BEGIN TRAN "을 실행하고, 변경하는 쿼리문을 실행한다.
잘 변경되었나 확인해보고, 잘 못 변경되었다면 ROLLBACK, 잘 되었다면 COMMIT을 실행시킨다.
주요 목적
트랜잭션의 주요 목적은 데이터의 무결성과 일관성을 보장하는 것입니다. 여러 작업을 단일 트랜잭션으로 그룹화하여 트랜잭션 내의 모든 작업이 성공적으로 실행되거나 아무 것도 실행되지 않도록 할 수 있습니다.
트랜잭션은 신뢰할 수 있고 일관된 데이터 처리를 보장하는 ACID속성을 따릅니다. 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)의 4가지 특징을 가집니다.
- 원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것을 의미
- 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것을 의미
- 독립성은 둘 이상 트랜잭션이 동시 실행시, 어떤 트랜잭션이라도 다른 트랜잭션 연산에 끼어들 수 없다는 점을 의미
- 지속성은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점
[ "트랜잭션에서 ACID 속성을 따른다"는 것은 원자성, 일관성, 독립성, 지속성을 최대한 지키려고 노력한다는 것을 의미"]
트랜잭션의 격리 수준 4단
- 트랜잭션 격리수준(isolation level)이란 동시에 DB에 접근할 때, 그 접근을 어떻게 제외할지에 대한 설정
- 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것. 즉, 특정 트랙잭션이 다른 트랜잭션이 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.
격리 수준 종류
- READ UNCOMMITED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
- 격리 수준 증가할 수록 일관성은 증가하지만 동시성은 감소
- 일반적인 DB 서비스는 READ COMMITED 또는 REPEATABLE READ 중 하나를 선택.
(oracle = READ COMMITED, mysql = REPEATABLE READ)
1. READ-UNCOMMITED
- 변경사항을 커밋하기 전에 다른 트랜잭션에서 조회할 수 있는 수준 (일반적으로 사용되지 않음)
- Dirty Read, Repeatable Read, Phantom Read 문제도 발생할 수 있음.
2. READ-COMMITED
- 어떤 트랜잭션의 변경내용이 커밋이 완료된 데이터만 다른 트랜잭션에서 조회 가능. 트랜잭션이 이루어지는동안 다른 사용자는 해당 데이터에 접근이 불가능.
- 커밋전에 조회가 됨으로 VALUE(값)의 오류가 발생할 수 있음
- 이 격리수준은 Oracle DBMS 에서 기본으로 사용하고 있으며, 대중적으로 가장 많이 선택되는 격리수준
- 결제 기능과 같은 금전적인 처리와 연결된 기능이라면 문제가 발생할 수 있음
- ‘Dirty Read’ 문제는 해결, 'Non-Repeatable Read’와 ‘Phantom Read’ 문제는 발생할 수 있음.
3. REPETABLE READ
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준. 트랜잭션이 완료될 때 까지 SELECT 쿼리가 사용되는 모든 데이터에 Shared Lock(공유 락)이 걸리는 계층. (VALUE의 오류가 발생할 수 없음)
- 원래 존재하지 않았던 컬럼이 조회될 수 있음 (Phantom Read)
- 대신 나머지 현상 사라짐
4. SERIALIZABLE
- 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션에서 절대 접근할 수 없음.
- 트랜잭션의 ACID 성질이 엄격하게 지켜지지만, 성능은 가장 떨어짐.
- 트랜잭션이 완료될때까지 SELECT 쿼리가 사용되는 모든 데이터에 Shared Lock(공유 락) 이 걸리는 계층
- 가장 엄격한 격리수준으로, 완벽한 읽기 일관성 모드를 제공한다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
격리수준에서 발생하는 문제
- Dirty Read: 이는 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 현상을 말합니다. 예를 들어, 한 트랜잭션이 데이터를 수정했지만 아직 커밋하지 않았는데, 다른 트랜잭션이 그 변경 사항을 읽는 경우를 말합니다. 이로 인해 데이터의 일관성이 깨질 수 있습니다.
- Non-Repeatable Read: 이는 한 트랜잭션이 동일한 데이터를 두 번 읽었을 때, 그 사이에 다른 트랜잭션이 해당 데이터를 수정하고 커밋하여 두 번째 읽기에서 다른 결과를 얻는 현상을 말합니다. 이로 인해 한 트랜잭션 내에서 데이터의 일관성이 깨질 수 있습니다.
- Phantom Read: 이는 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 그 사이에 다른 트랜잭션이 새로운 행을 삽입하거나 삭제하여 두 번째 쿼리의 결과 집합이 첫 번째와 다른 경우를 말합니다. 이로 인해 한 트랜잭션 내에서 쿼리 결과의 일관성이 깨질 수 있습니다.
'Computer Science (CS)' 카테고리의 다른 글
[CS공부 - 8회] www.google.com을 접속할 때 일어나는 일 (0) | 2023.12.14 |
---|---|
[CS공부 - 6회] 멀티 프로세스와 멀티 스레드 (1) | 2023.11.02 |
[CS공부 - 5회] RESTful API (0) | 2023.10.31 |
[CS공부 - 4회] 동기와 비동기 (블로킹과 논블로킹) (0) | 2023.10.27 |
[CS공부 - 3회] 객체지향과 절차지향 프로그래밍 (1) | 2023.10.25 |