Transaction ?
Atomic하게 실행되어야 하는 SQL 들을 묶어서 하나의 작업처럼 처리하는 방법, 즉 여러개의 쿼리가 동시에 실행되었을 때 데이터의 정합성이 문제가 되지 않는 경우를 Atomic 하다라고 한다.
- DDL / DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음.
- SELECT 에는 transaction을 사용할 이유가 없음
- BEGIN 과 END 혹은, BEGIN 과 COMMIT 사이에 해당 SQL 들을 사용하는 것을 Transaction 을 이용하는 방법.
- ROLLBACK
Transactio의 4대 특성 ( ACID )
- Atomicity(원자성) : Transaction 내의 모든 연산들은 모두 실행되거나, 모두 실행되지 않아야 한다는 특성을 말한다. 즉 transaction은 하나의 단위로 처리되어야 함을 말한다.
- Consistency(일관성) : Transaction 이 성공적으로 완료되면, 데이터 베이스는 하나의 유효한 상태에서 다른 유효한 상태로 변화해야 한다. 이는 데이터 베이스의 무결성 제약 조건을 항상 충족되어야 함을 의미한다.
- Isolation(독립성) : 동시에 여러 transaction 이 실행되고 있을 때 각 transaction은 서로 독립적으로 실행되는 것 처럼 보여야 한다. 즉 하나의 transaction의 중간 결과는 다른 transaction에서 확인할 수 없다.
- Dyrability(지속성) : Transaction이 성공적으로 완료되면, 그 결과는 영구적으로 데이터 베이스에 반영되어야 한다. 시스템이 문제가 되더라도 완료된 transaction의 결과는 손실 되어선 안된다.
transaction 의 사용 예시.
계좌이체는 인출과 입금 두 과정으로 이뤄진다.
만약에 인출에 성공했는데, 입금에 실패 한다면 ??
-> 이 두 과정은 동시에 성공하던지, 실패하던지 동시에 일어나야한다 즉 Atomic 하게 일어나야 한다.
이런 과정들은 transaction 으로 묶어주어야 한다.
만약 조회만 한다면 Transaction 으로 묶일 이유가 없다.
추가로 생각을 해보면 온라인 쇼핑몰의 주문의 경우에도 상품 주문 > 결제 > 재고 감소 > .. 등의 과정들이 모두 성공해야만 하며 중간에 하나라도 실패한다면 ROLLBACK 되어야 한다.
Transaction 의 관리 기법
- Locking : 데이터에 대한 동시 접근을 제어하여 데이터의 일관성과 독립성을 보장할 수 있다.
- Multi-Version Concurrency Control (MVCC) : 여러 버전의 데이터를 유지하여 동시성을 향상시키는 기법으로 이를 사용하여 읽기 작업이 쓰기 작업에 의해 차단되지 않고, 반대의 경우도 마찬가지로 실행될 수 있다.
- Log-Based Recovery : Transaction의 실행 중에 로그를 기록함으로써, 시스템 장애 발생 시에도 데이터의 일관성을 유지할 수 있다.
즉, Transaction은 데이터의 일관성과 신뢰성을 유지하는데 매우 중요한 역할을 한다.
BEGIN - END 문법을 이용한 예시.
다음과 같은 형태로 사용할 수 있다. 그림처럼 BEGIN 과 END 사이에 들어간 쿼리문은 하나의 쿼리처럼 처리되어 성공하면 모두 성공하고,실패하면 모두 실패한다.
END 와 COMMIT 은 동일하고, 실행 후 이전의 상태로 돌아가고 싶다면 "ROLLBACK" 을 명령어를 실행하면 이전 상태로 돌아갈 수 있다.
단, 이 동작은 COMMIT MODE 에 따라서 달라진다.
Transaction Commit Mode : autocommit
- Autocommit = True
- 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터 베이스에 쓰여지고, 이를 커밋 된다고 한다.
- 만약 어떤 특정한 작업들을 트랜잭션으로 묶고 싶다면 BEGIN 과 END(COMMIT) / ROLLBACK 으로 처리
- 트랜잭션으로 실행하면 트랜잭션으로 묶은 작업이 성공된다면 그 때 데이터 베이스에 쓰여진다.
- 커밋으로 쓰여져야지만 다른 사용자가 봤을 때 변경사항이 적용되어 있다.
- Autocommit = False
- 모든 레코드 수정/삭제/추가 작업이 commit 호출될 때 까지 커밋되지 않는다.
DELETE FROM vs TRUNCATE
- DELETE FROM <table> ( not DELETE * FROM )
- 테이블에서 모든 레코드를 삭제한다. ( 단 테이블은 남아 있음 ! )
- DROP TABLE <table> 과는 다른 명령어이다 ! ( 테이블 자체를 삭제하기 때문에 )
- WHERE 절을 이용해 조건에 맞는 레코드만 삭제가 가능하다.
- TRUNCATE <table>
- 테이블에서 모든 레코드를 삭제하는 것.
- 둘의 차이점은 DELETE FROM 은 transaction 에서 사용할 수 있고 ROLLBACK 도 가능하다
하지만, TRUNCATE transaction 에서 사용 할 수 있지만, ROLLBACK 이 안된다는 점에서 차이점이 있다. - TRUNCATE 는 시간을 빠르게 테이블의 모든 레코드를 삭제시킬 때 사용하기 적합한 삭제 명령어라고 볼 수 있다.
'DevCourse > SQL & Data Analytics' 카테고리의 다른 글
JOIN (1) | 2024.04.25 |
---|---|
GROUP BY 와 AGGREGATE 그리고 CTAS (1) | 2024.04.24 |