[오라클로 배우는 데이터베이스 입문] 11. 트랜잭션 제어와 세션

jychan99·2023년 9월 1일
0

트랜잭션

트랜잭션의 필요성을 알아보기위해 계좌이체를 예로 들어보자.
A계좌에서 B계좌로 100만원을 이체한다고 가정하자.
이체가 이루어지려면 2번의 update문이 있어야한다.

  • A계좌에서 -100만원
  • B계좌에서 +100만원

근데 A계좌에서 -100만원을 실행한후 갑자기 정전이 되어 B계좌에 +100만원을 이체하지 못했다고 가정하면, A도0원, B도0원으로 100만원의 데이터가 그냥 유실될것이다.

이런 상황을 막으려면 두가지 방법이 있는데,
첫번째 두 update문을 모두 완전히 실행하는것.
두번째 아에 실행하지 않는방법이다.

트랜잭션은 하나의 트랜잭션 내에 있는 여러 명령어를 한 번에 수행하여 작업을 완료하거나 아예 수행하지 않는 상태이다.(ALL OR NOTHING)
그리고 트랜잭션을 제어하기위해 사용하는 명령어를 TCL(Transaction Control Language)라고 한다.

----트랜잭션시작
sql> insert...
sql> update...
sql> ...
sql> TCL...
----트랜잭션 종료
----새로운 트랜잭션시작
sql> insert...
sql> update...
sql> ...
sql> TCL...
----트랜잭션 종료
.
.
이런식

트랜잭션을 제어하는 명령어

ROLLBACK

트랜잭션을 취소하고 싶을때 사용한다.

CREAT, ALTER, DROP등 DDL은 트랜잭션을 발생시키기 않으므로 ROLLBACK안됨주의

COMMIT

트랜잭션명령어를 데이터베이스에 영구히 반영할때 COMMIT한다.

실제 데이터베이스에 반영하려면 꼭 커밋을 해주어야 한다.
실무에서는 COMMIT을 잘못하면 되돌릴수 없기 때문에 정말 신중히 COMMIT해야한다.

세션과 읽기 일관성

세션

어떤 활동을 위한 시간이나 기간을 뜻한다.
단순하게, 게임을 하기위해 로그인해서 로그아웃할 때까지의 기간정도로 생각하면 된다.

데이터베이스에 접속한후 종료하기 까지의 과정또한 하나의 세션이므로
세션내부에는 하나 이상의 트랜잭션이 존재한다.
세션이 트랜잭션보다 큰 범위의 개념이다.

세션

트랜잭션1
sql> insert...
sql> update..
sql> rollback;

트랜잭션2
sql> insert...
sql> update..
sql> commit;

...

읽기 일관성

말그대로 데이터베이스에서 데이터를 읽을때 일관성있게 읽어야한다는 뜻이다.
A가 100만원을 보냈는데 B가 읽을때는 0원으로 읽으면 안된다는것이다.

SQL plus와 오라클 sql developer을 하나씩 열어서 2개의 세션을 열었을때,
한쪽에서 트랜잭션을 끝내기 전까지 다른 한쪽에서는 반영되기 전 데이터가 보인다.

LOCK

특정 세션에서 조작중인 데이터는 트랜잭션이 완료되기 전까지 다른 세션에서 조작할 수 없는 상태,LOCK이 걸린다.
마치 화장실칸에 누가 들어가있어서 다른사람은 못들어가고 기다리듯이.

sql+에서 update문을 날려서 세션을 먹고있으면, sql developer에서 delete를하든 update를하든 무한 대기가 걸린다. 이 현상을 HANG이라고 한다.

sql+에서 커밋을하거나 롤백을해서 트랜잭션이 완료가 되면, 그제서야 sql developer쪽에서도 쿼리가 수행된다.

실무에서도 lock을 일으키는 sql문을 실행하고, 커밋또는 롤백하지 않으면 다른 누군가는 lock 때문에 업무에 제한이 가게되니 주의하자.

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐍

0개의 댓글

관련 채용 정보