DB/Oracle

DB 47강. 트랜잭션

JJJAEOoni 2022. 2. 16. 21:46
반응형

트랜잭션(Transaction) : 일의 처리 단위(서비스)

COMMIT이 일어난 시점부터
다음의 COMMIT 전까지의 작업이 하나의 트랜잭션

일의 단위가 상대적이다.



입금(서비스)

* 계좌의 돈을 UPDATE(+) 하는 일
* 홍길동 : 기존 3000 (2000 입금) => 5000
* 하나의 UPDATE => 트랜잭션

송금(서비스)

* 홍길동 : 기존 3000 (2000 송금) => 1000
* 장보고 : 0 => 2000
* 업데이트 + 업데이트 => 트랜잭션

하나의 서비스를 처리하는 것을 트랜잭션

트랜잭션을 처리하는데
DML(INSERT, UPDATE, DELETE)이 한번 일어날 수도 있고,
여러 번 일어날 수도 있다.


트랜잭션이 중요한 이유!

TCL(Transaction Control Language) 명령어
-> commit, rollback

송금할 때 중요

트랜잭션 시작=========================================
홍길동 3000 (2000 송금) => 1000 (UPDATE 성공) -> 메모리 기록
장보고 0 (2000 입금) => 2000 (UPDATE 성공) -> 메모리 기록
======================트랜잭션 종료 -> 하드디스크 기록 COMMIT


트랜잭션 시작=========================================
홍길동 3000 (2000 송금) => 1000 (UPDATE 성공) -> 메모리 기록
장보고 0 (2000 실패) => 2000 (UPDATE 실패) -> 메모리 기록 실패
======================트랜잭션 종료 -> 하드디스크 기록 X ROLLBACK

홍길동 입장에서는 2000원이 날아갔는데
장보고는 받은 돈이 없다.

트랜잭션은 성공 - 성공일 때 제대로 처리된다.

UPDATE를 하면 실제로는 하드디스크에 기록이 안되고
메모리에만 기록된다.

아직 하드디스크에는 홍길동의 잔고는 3000이고
메모리에는 1000인 것이다.

메모리에 두 번의 UPDATE가 성공해야
하드디스크에 기록된다.
서비스가 끝날 때 COMMIT 하여 영구히 기록하는 것이다.

ROLLBACK 하면 원래 하드디스크에
기록되어있는 것을 토대로
메모리를 복구한다.



DB에서 Read(SELECT)하는 것은
다중 클라이언트가 동시에 가능하다.

그렇다면 클라이언트들이
동시에 Write(INSERT, UPDATE, DELETE)하는 것은 가능할까?

자원은 하난데 동시에 하나의 자원을 수정하는 게 말이 될까?
자원이 공유되는 것이다.

동기화를 시켜서 동시에 수정하는 것을 막아
순차적으로 진행해야 한다.



Read도 동시에 하면 안 되는 경우가 있다.

 


4시 50분 1초에 C1이 홍길동의 데이터를 읽으면
홍길동은 3000원이 있다.

이 돈으로 12년 동안 복리가 얼마일까 계산(3초 걸림)해서
고객에게 "1억이에요" 하고 알려주는 프로그램을 만든다.

복리계산이 끝나면 4시 50분 4초,
고객에게 던져줄 때 4시 50분 5초

이때 C2가 4시 50분 0초에 홍길동의 돈을 UPDATE 하고
또 하나의 UPDATE를 수행해야 하는 트랜잭션을 가진다.

4시 50분 0초에 홍길동 돈을 5000으로 UPDATE,
4시 50분 1초에 장보고의 돈을 3000으로 UPDATE
4시 40분 2초에 트랜잭션 COMMIT

1초까지는 홍길동 3000, 장보고 5000인 것이다.

트랜잭션 시간 때문에
실제로 복리는 2억인데
1억으로 계산될 수 있다.

실제 홍길동이 트랜잭션을 시작한 0초부터
트랜잭션이 끝나는 2초까지만
다른 쪽에서 read를 못하도록 막을 수 있다.


트랜잭션의 전략(ACID)이 있다.

격리성(Isolation) : 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없다.

트랜잭션이 일어나는 동안
read 할 때 없는 데이터를 읽을 수도 있다.

그래서 꼭 write 할 때뿐만 아니라
read 할 때도 트랜잭션의 개념이 중요하다.

-- 트랜잭션 시작 (insert, insert) = 서비스 
INSERT INTO userTbl(id, username, password, gender) VALUES(5, 'yang', '1234', '여');
INSERT INTO userTbl(id, username, password, gender) VALUES(5, 'kong', '1234', '여'); 

-- if 만약에 둘다 성공하면 
commit; 

-- else if 둘중에 하나라도 실패하면
rollback;





[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형