트랜잭션
트랜잭션은 하나 이상의 SQL 문을 포함하는 단일 논리적 작업 단위입니다.
트랜잭션은 데이터베이스 시스템에서 데이터 무결성과 일관성을 보장하는 데 사용됩니다.
동일한 데이터에 대한 여러 작업이 동시에 발생할 수 있는 다중 사용자 및 동시 데이터베이스 환경에서 매우 중요합니다.
예시로 아래의 SQL 문이 작동하는 것을 봅시다
홍길동이 김국밥에게 잔액을 +900을 줬지만 3번에서 실패가 발생했습니다
이 경우, 데이터의 정합성이 깨집니다.
위의 그림처럼, 홍길동은 900이 그대로 남았지만, 김국밥은 잔액이 900원이 더 생긴 상태로 쿼리가 종료 되었습니다
눈 먼 돈이 생겨버렸죠
이러한 문제 때문에 여러 SQL문을 마치 하나의 오퍼레이션으로 묶어야 하는 필요가 생겼습니다
ACID
ACID로 참조되는 네 가지 주요 속성이 있습니다.
- Atomicity
- 이는 트랜잭션이 분리할 수 없는 단일 작업 단위로 취급됨을 의미합니다.
- 모든 변경 사항이 데이터베이스에 커밋되거나 트랜잭션이 어느 시점에서 실패하면 모든 변경 사항이 롤백됩니다.
- Consistency
- 이는 트랜잭션이 데이터베이스를 하나의 유효한 상태에서 다른 상태로 가져오는 것을 보장합니다.
- 데이터베이스의 미리 정의된 규칙, 제약 조건 및 트리거는 트랜잭션 전후에 유효해야 합니다.
- Isolation
- 이는 트랜잭션의 중간 상태가 다른 트랜잭션에 보이지 않음을 의미합니다. 그 결과 동시에 실행되는 트랜잭션이 직렬화되는 것처럼 보입니다.
- Durability
- 트랜잭션이 커밋되면 전력 손실, 충돌 또는 오류가 발생하는 경우에도 트랜잭션이 그대로 유지되도록 합니다.
트랜 잭션의 예시
일단, Orders
와 Inventory
라는 두 개의 테이블이 있다고 가정합니다.
새로운 주문이 들어오면 Inventory
테이블에서 주문한 항목의 수량을 줄이고 Orders
테이블에 새 레코드를 추가해야 합니다
START TRANSACTION;
INSERT INTO Orders (ProductID, CustomerID, Quantity)
VALUES (1, 101, 3);
UPDATE Inventory
SET Quantity = Quantity - 3
WHERE ProductID = 1;
IF there_is_an_error THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
START TRANSACTION;
트랜잭션을 시작합니다.INSERT INTO
문은Orders
테이블에 새 주문을 추가합니다.UPDATE
문은Inventory
테이블에서 주문한 항목의 수량을 줄입니다.COMMIT;
은 트랜잭션을 종료하고 변경 사항을 데이터베이스에 영구적으로 저장합니다.
INSERT INTO
또는 UPDATE
문 중에 오류가 발생한 경우 COMMIT;
대신 ROLLBACK;
을 사용하여 트랜잭션의 모든 변경 사항을 취소할 수 있습니다.
START TRANSACTION;
INSERT INTO Orders (ProductID, CustomerID, Quantity)
VALUES (1, 101, 3);
UPDATE Inventory
SET Quantity = Quantity - 3
WHERE ProductID = 1;
IF there_is_an_error THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
728x90
'DEV > Backend' 카테고리의 다른 글
동시성 제어 (1) | 2023.06.10 |
---|---|
트랜잭션 격리레벨 (0) | 2023.06.10 |
Fan Out On Read (Pull Model) (0) | 2023.06.09 |
Fan Out On Write (Push Model) (0) | 2023.06.09 |
커버링 인덱스 (0) | 2023.06.09 |