Database

RDBMS -트랜잭션 검토

devMarco 2018. 6. 22. 14:36

RDBMS -트랜잭션 검토

1. 트랜잭션이란?

여러 단계를 걸쳐 수행하는 작업을, 
한 번에 수행할 수 있는 작업처럼 다루는 기능

핵심 : 작업을 모두 수행해놓거나, 이상이 생길 경우 수행하지 않은 상태로 두는 것

ex) 돈 거래

두 플레이어가 아이템과 골드를 교환한다고 가정하자.
다음과 같은 순서로 데이터 전달이 이뤄진다.

1. 플레이어 1과 2가 거래 확인을 누른다.

2. 플레이어 1의 지갑에서 5만원을 감소시킨다.

3. 플레이어 2의 지갑에서 5만원을 증가시킨다.

4. 플레이어 2의 인벤토리에서 아이템을 지운다.

5. 플레이어 1의 인벤토리에서 아이템을 생성한다.

6. 거래 종료


만약 2번에서 5번 과정 도중에 렉이 걸려서 DB가 동작하지 않는다면?
플레이어가 손해를 보는 상황이 발생할 것이다.
따라서 DB에서는 거래가 성사됐다면 모든 과정이 실시되어야 하고,
거래 도중 이상이 생긴다면 아예 거래를 처음부터 실시하지 않은 상태로 되돌려야 한다.

거래가 모두 진행 되있거나(all) 거래가 아예 시작되지도 않거나(none) 개념이며,
all or none / atomic 이라고도 표현한다.



2. 트랜잭션 성능

DB 스토리지 엔진에서 트랜잭션 지원 여부가 결정된다.

DBMS 선정도 중요하지만, 트랜잭션을 지원하는 스토리지 엔진 사용도 필요하다.

테이블 별로 엔진 설정 또한 가능하다.

트랜잭션의 사용 여부가 테이블 성능에 영향을 줄 수 있다.


3. 트랜잭션 사용 방법

테이블에서 트랜잭션을 지원하는 DB 엔진을 사용하도록 설정한 후(InnoDB 많이 사용)

주의 : 트랜잭션 과정에서는 테이블에 락이 걸리므로,
다른 쿼리를 적용할 수 없음(INSERT, UPDATE 등)

SQL문으로 트랜잭션 시작
SQL: BEGIN TRANSACTION; 

DB에 필요한 작업들 수행 후 커밋 SQL문으로 DB에 적용.
커밋 전에 생긴 데이터 변화는 적용되지 않음.
SQL: COMMIT;

의문 사항 

테이블에 락이 걸리면 여러 유저의 트랜잭션 요구를 들어줄 수 있을까?

각 RDBMS에서 어떻게 트랜잭션을 구현하고 있을까?