트랜잭션의 정의 

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.

 

예를 들어 A계좌에서 B계좌로 일정 금액을 이체한다고 가정해 보겠습니다.

 

이를 위해서는 A계좌의 잔액을 확인하고 현재 금액에서 인출할 금액을 뺀 나머지 금액을 다시 저장합니다. 그런 다음 B계좌의 잔액을 읽어 들인 후 이체된 금액을 더하고 그 합을 다시 저장하면 계좌이체가 완료됩니다. 즉 두 개의 업데이트 문장을 실행해야 합니다. 만일 A계좌에서 인출하는 SQL문은 성공했는데 B계좌로 입금하는 SQL문이 실패할 경우 어떻게 되겠습니까?

 

결론적으로 계좌이체는 되지 않고 데이터베이스의 금액이 맞지 않게 됩니다(금액 손실). 그래서 이러한 과정들이 모두 합쳐져 하나의 작업단위를 구성합니다. 즉 성공을 해도, 실패를 해도 같이 움직이는 최소한 SQL문을 작업단위로 묶습니다. 데이터베이스에서는 이와 같은 하나의 논리적인 작업 단위를 구성하는 연산들의 집합을 트랜잭션이라 합니다앞의 예에서는 계좌이체가 하나의 트랜잭션으로 묶입니다.

 

이러한 관점에서 데이터베이스 응용 프로그램은 트랜잭션들의 집합으로 정의 할 수 있습니다.여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합을 말합니다.

 

 

트랜잭션(Transaction) 필요성

 

트랜잭션을 정의하는 이유는 무엇일까요? 계좌이체를 다시 생각해보겠습니다.

 

많은 사람들이 현금 인출기에서 카드를 이용하여 계좌이체를 한 경험이 있을 것입니다. 이때 현금 인출기를 작동하는 도중에 기계오류나 정전 등과 같은 예기치 않은 상황이 발생하여 카드가 나오지 않거나 기계가 멈추는 경우가 있습니다. 이때 가장 우려되는 것이 내 계좌에서는 금액이 빠져나간 것으로 기록되고 정작 상대방 계좌에는 이체가 되지 않는 상황입니다.

 

트랜잭션이란 바로 이러한 문제가 발생되지 않도록 하는 강력한 수단을 제공해주는 것입니다. , 내 계좌에서 금액이 빠져나가기 전 상태로 돌아가던지, 아니면 상대방 계좌로 이체가 성공적으로 끝나도록 보장해줘야 합니다

 

, 계좌이체를 실행 할 때는 계좌이체에 정의된 모든 연산을 완벽하게 실행하던지, 아니면 모두 실행하지 않고 처음의 상태로 남아있어야 합니다.

 

또 다른 예로 판매 시스템에서 A라는 제품의 재고가 5개 남아 있다고 가정해 보겠습니다. 서로 다른 고객이 A라는 제품의 재고 5개를 동시에 확인하고 구매를 하려고 합니다. 각각 재고 하나를 뺍니다. 그러면 고객1과 고객2모두 남은 재고 수 4로 계산되어, 각각 저장합니다. 결국 고객1과 고객2 각각 1개를 구매하여 결국 2개를 판매한 셈이 되고 남은 재고 수는 4개가됩니다.

이런 상황은 올바르지 못합니다. 이러한 오류의 원인은 고객1이 남은 재고 수를 4로 저장하였고, 고객2 4로 저장함으로써, 둘 중 하나가 다른 고객이 저장한 재고 수를 덮어 써버렸기 때문입니다. 결국 다중 사용자 환경에서 하나의 트랜잭션이 동시에 실행되는 다른 트랜잭션에 의해 영향을 받은 결과입니다.

 

따라서 지금까지 예를 든 상황과 같이 원하지 않는 결과가 발생되지 않도록 사전에 방지하기 위해서 트랜잭션은 필요합니다. 현재 대부분의 DBMS들은 이러한 상황을 방지하기 위한 기능을 갖추고 있습니다. 이를 위해 데이터베이스 개발자는 작업 단위들을 트랜잭션으로 적절히 정의해야 합니다. , 트랜잭션을 정의하는 것은 전적으로 개발자의 의무이지만, 정의된 트랜잭션들에 대해서 위와 같은 문제가 발생하지 못하게 방지하는 것은 DBMS의 몫입니다.

 

 

트랜잭션의 특징

 

  1.   트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위입니다.

 

2.   사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위입니다.

 

  3.   하나의 트랜잭션은 Commit되거나 Rollback됩니다.

 

 

트랜잭션의 성질

 

 

l Atomicity(원자성)

 

Ø 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 합니다.

 

Ø 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 합니다.

 

l Consistency(일관성)

 

Ø 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환합니다.

 

Ø 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 합니다.

 

l Isolation(독립성, 격리성)

 

Ø 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없습니다.

 

Ø 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없습니다

 

l Durablility(영속성, 지속성)

 

Ø 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도 영구적으로 반영되어야 합니다.

 

 

트랜잭션 연산

 

 

l Commit(커미트)

   Commit 연산은 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된

   상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산입니다.

 

l Rollback(롤백)

   Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때,

   이 트랜잭션의   일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든

   연산을 취소(Undo)하는 연산입니다. Rollback시에는 해당 트랜잭션을 재 시작하거나 폐기합니다.

 

 

트랜잭션의 상태

 

 

트랜잭션.jpg

l  활동(Active)                          : 트랜잭션이 실행중인 상태

 

      l  실패(Failed)                          : 트랜잭션 실행에 오류가 발생하여 중단된 상태

 

      l  철회(Aborted)                       : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

 

      l  부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태

 

      l  완료(Committed)                   : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행 한 후의 상태

 

 

 

다운로드 : 10장 트랜잭션의정의.pdf

 

 


프로그래밍을 제대로 공부해보고 싶다면, 다음 순서로 진행하시는 것을 권장합니다.

 

  1. 프로그래밍 애피타이저 시리즈
  2. [동영상] 데브기어 델파이 기초 시리즈
  3. [오프라인 강의] 델파이/C++빌더 기초 강화
  4. [오프라인 강의] 델파이/C++빌더 윈도우 프로그래밍

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15454
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13966
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16503
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22060
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23268
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18925
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39261
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174727
223 [베를린 U2] 새로운 윈도우 10 스타일 적용하기 (1분 동영상) 험프리 2016.11.15 445
222 [프로그래밍 애피타이저] 3장 변수와 상수 file 김원경 2020.04.07 443
221 [발표자료] 20191205 기술브리핑! 20분만에 파악하는 RAD스튜디오 10.3.3 file 관리자 2019.12.05 443
220 이 달의 기술자료 - 2018년 12월 file 험프리 2018.11.30 443
219 [시애틀] IDE 메모리 개선으로 더 큰 프로젝트를 더 빠르게 코딩하고, 더 빠르게 컴파일 할 수 있습니다. 험프리 2015.10.05 442
218 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 7장. 센서와 서비스로 스마트폰 제어하기 [1] 관리자 2020.02.04 442
217 [10.3 리오][업데이트 2] 델파이에서 맥OS 64-bit 애플리케이션 개발이 가능합니다. 관리자 2019.07.25 442
216 [시애틀] 20개 이상의 IDE 생산성 기능들이 내장되어 생산성, 품질, 안정성이 향상됩니다. Humphery 2015.09.04 442
215 이 달의 기술자료 - 2016년 11월 험프리 2016.10.28 441
214 [고객 사례- 의료, 임베디드DB] PAR Springer-Miller Systems – SpaSoft  관리자 2016.11.03 440
213 윈소프트(Winsoft) – 스탠다드 컴포넌트 패키지 (100+가지) 관리자 2020.09.01 438
» [프로그래밍 애피타이저] 10장 트랜잭션의 정의 file 김원경 2020.04.09 438
211 리눅스 앱에 '윈도우 10 컬러 스타일'을 적용하고 싶다면 - Aqua Graphite 스타일 관리자 2019.09.09 438
210 [오픈소스] AutoTablesForRADServer - RAD 서버용 REST API 자동 생성기 file 험프리 2018.10.26 438
209 /n 소프트웨어 – IPWorks WebSockets 관리자 2020.09.01 437
208 TMS Aurelius - ORM 프레임워크 관리자 2020.08.27 436
207 [고객사례-게임, 델파이] Tears of Ra 관리자 2020.01.10 436
206 이 달의 기술자료 - 2017년 04월 file 험프리 2017.03.30 434
205 안드로이드 앱의 난독화 - 파이어몽키로 작성한 네이티브 앱은 디컴파일할 수 없어 보안에 강력합니다. 험프리 2020.02.24 434
204 [10.3 리오][업데이트1] iOS 12, iPhone X 시리즈 디바이스들 지원 관리자 2019.02.22 434