Transaction

부천대 IoT 데이터 활용을 수강하는 학생들을 위한 자료

Transaction이란?

일상생활의 예를 들어보자. 민수는 Nike Dunk Low 범고래 운동화를 구매하고 싶은데 때마침 NIKE 온라인에서 금일 오전 11시에 사이즈 별 100족 정도선착순으로 판매한다는 소식을 들었다.

11시가 되자마자 민수는 NIKE에 접속을 하였고, 운좋게 자신의 신발사이즈에 맞는 운동화를 구매했다.

이때 데이터베이스에서는 '트랜잭션 처리를 성공했다'.

트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위로 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위이다. 즉 사용자가 어떤 시스템에서 액션을 통해 그 요청이 끝난 상태를 말한다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다[1].

트랜잭션을 조작하는 기능은 사용자가 데이터베이스 완전성(Integrity) 유지를 확신하게 한다.

단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구하는데 이때 하나의 트랜잭션은 Commit되거나 Rollback된다. 그리고 트랜잭션은 서로 간섭하지 않아야 한다[1].

Transaction의 특징

  • 원자성 (Atomicity)

  • 일관성 (Consistency)

  • 독립성 (Isolation)

  • 지속성 (Durability)

원자성(Atomicity)

원자성은 데이터 조작이 전부 성공 혹은 실패할지 보증하는 구조로 트랜잭션이 데이터베이스에 모두 반영되든지 전혀 반영되지 않아야 한다.

트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며(Commit), 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다(Rollback).

다음 예시를 들어보자.

우리가 마블 코믹스 영화를 예매 할 때 원하는 시간대와 자리, 결제 등 예매과정을 모두 성공한 후 예약확인문자까지 받거나 갑자기 예매하는 과정에서 인터넷이 좋지않아 도중에 예매가 취소되는경우가 있다.

우리가 송금할 때 자금이체는 성공할 수도 실패할 수도 있다. 이 때 보내는 쪽에서 송금 작업만 성공하고 받는 쪽에 입금 실패해서는 안된다. 보내는 쪽에서 이체를 성공해야되고 동시에 받는 입장에서는 입금이 되어야 한다.

일관성(Consistency)

일관성은 데이터 조작 전후에 일관성을 유지하는 단계로 위의 송금 예제에서 금액의 데이터 타입이 정수형(integer)인데, 갑자기 문자열(string)이 되지 않고 모두 데이터 타입이 같은 상태를 말한다.

즉 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환되어야 한다. 따라서 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.

고립성(Isolation)

고립성은 복수 사용자가 동시에 데이터 조작 실행할 경우 각각의 처리가 모순 없이 실행되는 것으로 트랜잭션 작업 수행 중에는 다른 트랜잭션에 영향을 주어서도 안되고, 다른 트랜잭션들에 의해 간섭을 받아서도 안 된다는 것을 의미한다. 다수의 트랜잭션이 동시에 수행중인 상황에서 하나의 트랜잭션이 완료될 때까지는 현재 실행 중인 트랜잭션의 중간 수행결과를 다른 트랜잭션에서 보거나 참조 할 수 없다[2].

예를 들어 마블 코믹스의 영화 11시 타임을 예약하려는데 커플좌석이 한자리 밖에 안남은 상황에서 여러 사용자가 구매를 동시에 한다고 하자. 제일 먼저 클릭을 시도한 유저가 그 커플좌석을 예매하면, 다른 유저들은 그 좌석을 선택하지 못한다. 그런데 그 클릭을 시도한 유저가 좌석을 취소한 경우 두번쨰로 좌석을 예매하는 유저가 그 좌석을 선택할 수 있는 기회가 주어지고, 예약을 시도한다. 이 때 다른 유저들이 그 좌석을 선택하지 못하게 만들어 중복으로 같은 좌석을 예매되는 경우가 않도록 한다.

지속성(Durablility)

일련의 데이터 조작(트렌젝션 조작)을 완료 하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것을 말한다[2]. 즉 트랜잭션이 Commit 된 이후에 데이터 변경 사항이 영구적으로 확정되도록 보장하는 것을 말한다. 시스템이 정상일 때 뿐 아니라 데이터베이스나 OS의 이상 종료, 즉 시스템 장애도 견딜 수 있다는 것을 말한다.

예를들어 이체 과정에서 송금을 하는 유저가 송금을 하고 입금 받는 쪽에서 입금이 완료되었는데, 갑자기 1시간 이후에 취소되는 경우가 되어서는 안된다.

격리수준(Isolation Level)

트랜잭션 격리수준(isolation level)이란 여러 트랜잭션이 동시에 처리될 때, 서로 다른 트랜잭션에서 얼마나 변경 조회하는 데이터를 어느 단계까지 볼 수 있는지 설정하는 것이다. 즉, 간단하게 말해 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용수준을 정하는 것이다. 격리수준은 4가지로 나뉘는데 'READ UNCOMMITTED', 'READ COMMITTED', 'REPEATABLE READ', 'SERIALIZABLE' 가 있다.

격리수준에 따른 발생 가능한 문제

데이터 격리수준에 따라 발생 할 수 있는 부정합 문제가 있다. 대표적으로 DIRTY READ , NON REPEATABLE READ, PHANTOM READ가 있다.

DIRTY READ

트랜잭션에서 작업이 다 끝나지 않았지만 다른 트랜잭션에서 작업 내용을 볼 수 있는 것을 DIRTY READ라고 다. 변경된 데이터가 롤백될지, 커밋될지 모르는 상황에서 작업 내용을 조회할 수 있기 때문에 데이터 정합성에 큰 문제를 유발할 수 있다.

NON REPEATABLE READ

하나의 트랜잭션에서는 같은 SELECT문으로 조회할 때 항상 같은 결과를 가져와야 다. 이를 REPEATABLE READ라고 부르는데 SELECT할 때 마다 다른결과를 받을 수 있다면 이를 NON REPEATABLE READ상태라고 부릅니다.

PHANTOM READ

하나의 트랜잭션에서 같은 SELECT문으로 조회할 때 이전 SELECT에서는 존재하지 않던 값이 다음 SELECT에 조회되는 것을 의미다.

격리 수준

설명 [3]

Read Uncommitted

Commit 되지 않은 읽기

트랜잭션에서 처리 중인 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용. 이런 경우 동시성이나 성능은 높아질 수 있으나 데이터의 정합성은 떨어질 수 밖에 없다. 명령어: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM (테이블 명) GO

ex) A유저가 데이터를 update를 하고 commit은 하지 않는 상황에서 다른 유저가 기데이터를 조회했는데, A가 Rollback을 했다. 이랬을 때 다른 유저는 반영되지 않는 데이터를 조회했다. 실생활 예를들면 갈대같은 여친의 마음을 미리 알아채는 남자친구 마음?

발생가능한 문제 - DIRTY READ, NON REPEATABLE READ, PHANTOM READ

Read Committed

Commit된 읽기 오라클DB의 기본격리 수준단계다.

트랜잭션이 Commit 확정된 데이터만 다른 트랜잭션이 읽도록 허용 명령어: SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRAN SELECT * FROM (테이블 명) GO

ex) 여자친구가 변심하여 더이상 만날 수 없다고 통보했을 때 알게된 남자친구

발생가능한 문제 -NON REPEATABLE READ, PHANTOM READ

Repeatable Read

반복 읽기

트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지 명령어: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRAN

SELECT * FROM

ex) 1. 어떤유저가 영화예매를 하는 과정에서 특정 좌석을 조회할 때 반복읽기를 했을 경우 LOCK을 걸려 그 좌석에 대한 소유가 있고, 다른 유저 그 좌석에 대해 update 할 수 없다.

2. 실생활 예로 들면 여자친구가 딴남자는 쳐다보지않도록 콩깍지를 단단히 씌우는 일?

발생 가능한 문제 - PHANTOM READ

Serializable

직렬화 가능

트랜잭션 내에서 쿼리를 두 번 이상 수행할 대, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않음 DBMS 운영 시 동시성이 떨어져 성능 상 이슈가 발생 명령어: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

SELECT * FROM 테이블

ex) 어떤 유저가 특정작업을 완료할 때까지 다른누군가가 데이터를 insert나 update 시키지도 못하게 하는 상황

실생활 예로들면 인기많은 여자친구의 주변으로부터 많은 남자가 대시를 하지만 강력한 부폰 카시야스 같은 남자친구가 다 쳐내는 경우

위의 격리수준에 따라 3가지 데이터 부정합의 현상을 정리하면 다음 표와같다.

격리 수준

Dirty Read

Non-Repeatable Read

Phantom Read

Read Uncommitted

가능

가능

가능

Read Committed

불가능

가능

가능

Repeatable Read

불가능

불가능

가능

Serializable Read

불가능

불가능

불가능

가장 디테일한 설명을 원하시는분은 아래 사이트를 참고하시길 바란다.

https://transferhwang.tistory.com/513

Reference

[1]https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98

[2] 미크, 기무라 메이지-데이터베이스 첫 걸음

[3] https://eastluck.tistory.com/1

Last updated