본문 바로가기
학부 전공/DB

SQL - Transaction 개념 및 정리

by 장어진 2021. 6. 19.

데이터베이스는 다수의 사용자들이 동시에 접근하는 경우가 빈번하게 발생합니다. 그러나 여러 사용자가 동시에 데이터베이스에 접근하는 상황에서 사용자들에 대한 적절한 통제가 이루어지지 않는다면, 데이터베이스의 무결성이 깨지고, 어떠한 transaction의 수행에 대해 의도하지 않은 결과가 반환될 수도 있습니다. 예를 들어 교차로 상황을 생각해보겠습니다. A라는 차가 사거리에서 남쪽에서 북쪽으로 진행을 하려고 하고 B라는 차가 동쪽에서 서쪽을 동시에 지나가려고 한다면 충돌이 일어나고 사고가 발생할 것입니다. 이와 같이 데이터 베이스에서도 충돌이 일어날 수 있고 데이터 값이 이상해지는 현상이 발생할 수 있습니다. 따라서 DBMS (Database Management System)는 동시성 제어 (concurrency control)라는 기능을 제공하여 데이터베이스의 무결성을 보호하고, transaction이 항상 정확하고 일관된 데이터를 참조할 수 있도록 해야합니다.

 

항공 예약시스템을 예로 들어보겠습니다. 유저122A라는 좌석을 예약하려하고 유저222A라는 좌석을 예약하려고 할 때 유저1이 먼저 예약했음에도 유저2도 빈 좌석으로 조회가 되어있어 두 사람이 동시에 같은 좌석을 예약할 가능성이 있을 수 있습니다. 그래서 비행기를 타러 갔을 때 두 사람이 동일 좌석을 예약해 충돌이 일어날 수 있으므로 유저1이 있는 트랜잭션과 유저2가 있는 트랜잭션이 오버랩 안 되게 하고 유저1이 먼저 실행되고 유저2가 실행되게 끔 하는 방법이 있습니다. 이렇게 실행되는 것을 serially라고 설명합니다.

serial의 문제는 트랜잭션이 동시에 돌 수 있는 것도 존재함에도 차례차례 실행한다는 것입니다. 예시로 대전에 차가 동시에 돌아다닐 수 있음에도 차 한 대만 지나갈 수 있다는 것입니다. 그래서 현실적으로는 적용하지 않는다고 합니다. 대신에 마지막에 실행이 다 끝나고 검사할 때는 필요한 개념이라 있다고 합니다. 실제로는 serializable이라는 개념을 적용합니다. serializable이란 어떤 특정한 스케줄링의 결과가 serial 하게 실행한 결과와 같다면 serial하지는 않지만 serializable한 결과이다 라는 것입니다. 따라서 유저1이 항공권을 예약하는 과정을 하나의 트랜잭션으로 선언하고 유저2가 항공권을 예약하는 과정을 또 다른 하나의 트랜잭션으로 선언을 해주는 것입니다.


Atomicity)

Accounts(acctNo, balance)

 

UPDATE Accounts

SET balance = balance + 100

WHERE acctNo = 456;

 

/*** CRASH CRASH CRASH ***/

 

UPDATE Accounts

SET balance = balance - 100

WHERE acctNo = 123;

위와 같은 예시가 있을 때 위에 있는 수식과 밑의 수식을 하나의 트랜잭션으로 묶지 않는다면 중간에 CRASH, 정전 같은 사태가 일어나면 위의 계좌 잔고에 +100은 되었지만 123 계좌에서 -100이 되지 않는 일이 벌어질 수 있습니다. 따라서 개발자가 이를 잘 생각하여 하나의 트랜잭션으로 묶어주어야합니다.


Isolation) Programmer must specify the isolation level. 프로그래머가 특정 isolation level을 특정해주어야 한다는 뜻인데 그 단계는 4가지가 존재한다.

1) SERIALIZABLE (default of SQL standard)

2) REPEATABLE READ

3) READ COMMITTED (default of many DBMS)

4) READ UNCOMMITTED

4단계로 올 수록 독립성이 낮은 것으로 스피드를 빠르게 하기 위해서 독립성을 낮추는 경우가 있다고 합니다. 또한, 3단계 READ COMMITTED 단계를 디폴트로 많이 사용한다고 합니다.

트랜잭션을 시작하기 위해서 BEGIN TRANSACTION 또는 START TRANSACTION이라는 명령어를 사용할 수 있고 끝을 알리기 위해서는 COMMIT ROLLBACK이 존재한다고 합니다. COMMIT은 절대 되돌릴 수 없음을 말하고 rollback은 처음으로 돌리는 것을 말합니다.

 

728x90

'학부 전공 > DB' 카테고리의 다른 글

SQL - ISOLATION LEVEL & Dirty read  (0) 2021.06.19
SQL - Transaction 실제 사용 예시  (0) 2021.06.19
Databas Modifications - Updates(SQL)  (0) 2021.06.19
SQL INSERT  (0) 2021.06.19
DB SQL INSERT 오류 해결하는 과정  (0) 2021.06.19