FireDrago
[DB] 트랜잭션 본문

<트랜잭션 이란>
계좌이체 작업을 데이터베이스에 저장한다고 생각해보자
우선 이체하는 사람에게서 이체금액을 뺀다. -- 1번 작업
이체 받는 사람에게 이체금액을 더한다. -- 2번 작업
최소 두번 이상의 작업이 필요하다. 만약 1번 작업 이후에 에러가 발생하여 2번작업이 실행되지 않으면 어떻게 될까?
이체하는 사람은 이체금액이 빠졌는데, 이체받는 사람은 돈이 입금되지 않는 엄청난 사고가 발생할 것이다.
이런 오류를 막기위해, 데이터베이스는 여러작업을 하나의 단위로 묶는 트랜잭션 기능을 제공한다.
<트랜잭션 기능 이해>


트랜잭션 기능을 수행하기 위해, 데이터베이스는 Commit 과 Rollback 명령어를 지원한다.
1번, 2번 작업이 모두 수행되어 작업이 안전하게 끝났다면, Commit 명령어로 변경사항을 DB에 반영한다.
Commit 이후부터 다른 사람도 데이터의 변경을 조회할 수 있게 된다.
1번 2번 작업중 하나라도 수행되지 못했다면 Rollback 명령어로 모든 트랜잭션 작업을 취소한다.
1번 작업이 수행되었고, 2번작업이 수행되지 못하여 Rollback 된 경우 1번작업 변경사항 까지 모두 취소된다.
아예 작업이 시작되지 않은 것 처럼 되는것이다.
트랜잭션을 시작하기위해서는 autocommit 옵션을 false로 설정해야한다.
기본적으로 DB는 각각의 작업마다 자동 커밋되도록 기본값이 설정되어 있다.
따라서 트랜잭션 기능을 이용하기 위해서 autocommit 을 false로 설정하고,
트랜잭션 작업을 수행한뒤 수동으로 커밋을 해줘야 한다. Sql문을 살펴보자
<DB 락>

트랜잭션 작업이 수행도중에 다른 사람이 트랜잭션 중인 데이터를 변경하려고 하면 어떻게 될까?
A 가 B 에게 이체하는 트랜잭션 작업중에 C 가 A에게 입금한 데이터를 반영하게 된다면,
데이터가 서로 꼬일 수 있다. 이럴경우를 대비하여 트랜잭션이 실행중일때는 DB 락을 가진 작업만이
데이터를변경할 수 있다. 트랜잭션이 완료 (Commit, Rollback) 된 경우에만 다른 사람이
DB 락을 획득하고, 데이터를 변경할 수 있게 된다.

일반적으로 데이터를 조회하는 Select 문은 DB락이 필요없다. 데이터를 변경하지 않기 때문이다.
하지만 예외적인 경우 for update 문을 사용하여 DB락을 걸고 트랜잭션 완료될때까지
해당 데이터를 타인이 변경할 수 없게 만들 수 있다.
(마감 조회나 조회후 복잡한 계산이 필요한 경우 예외적으로 사용된다.)
'DB' 카테고리의 다른 글
| [mySQL] 제약조건 (0) | 2023.08.07 |
|---|---|
| [mySQL] JOIN 문 (0) | 2023.08.03 |
| [DB] SELECT문 총정리 (0) | 2023.08.01 |
| [Oracle] INSERT / SELECT / UPDATE / DELETE 기본문법 (0) | 2023.05.13 |
| [Oracle] 오라클 데이터 타입 (0) | 2023.05.13 |
