CS/데이터베이스

트랜잭션(Transaction)이란 무엇인가?

로드존슨 2023. 4. 13. 12:27
728x90

트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위  또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.영어로 간략히 Tx라고 표기하며 1초당 처리할 수 있는 트랜잭션의 개수를 TPS라고 한다.

 

 

데이터베이스의 상태를 변환시키는 하나의 논리기능을 수행하기 위한 작업의 단위란 무엇일까?

간단하게 말해서 아래의 질의어(SQL)를 이하여 데이터베이스를 접근하는 것을 의미한다.

- SELECT, INSERT, DELETE, UPDATE 가 있으며 작업의 단위는 질의어 한 문장이 아니라는 점이다.

  게시판에 INSERT를 했으면 게시판 조회시 SELECT가 가능해야 한다. 

 

예를 들어 A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤수가 없는 하나의 트랜잭션을 구성한다.
만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다.
트랜잭션 처리가 정상적으로 완료된 경우   ' 커밋 '
오류가 발생할 경우 원래 상태대로 ' 롤백 ' 을 한다.

 

트랜잭션의 목적


트랜잭션은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 엑세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다. 

데이터 베이스 기능 중 , 트랜잭션을 조작하는 기능은 데이터베이스 완전성 유지를 확신하게 한다. 

만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다. 

데이터 베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 한다.

ACID 속성을 준수함으로써  트랜잭션은 DBMS에서 데이터의 일관성 안정성 을 보장하고 데이터 불일치, 충돌을 방지하고 데이터베이스가 신뢰할 수 있고 예측 가능한 상태로 유지되도록 한다. 


낮은 격리(고립)단계 선택시 발생되는 문제 

트랜잭션에서 낮은 격리(고립)을 수준을 선택하면 데이터 일관성이 떨어지고 동시 엑세스 충돌 위험이 높아진다.

격리수준이 낮으면 데이터에 대한 동시 엑세스가 더 많이 가능하지만 데이터 불일치 및 트랜잭션 간의 충돌가능성도 높아진다. 예를 들어 격리 수준이 낮으면 트랜잭션이 커밋되지 

트랜잭션의 조건


ACID란 Atomicity(원자성), Consistency(일관성), Isolation(고립성), Durability(지속성)의 약자로서, 데이터베이스의 트랜잭션이 안전하게 수행되기 위한 4가지 필수적인 성질을 말한다.

 

원자성 

하나의 트랜잭션이나 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다. 트랜잭션이 데이터베이스에 모두 반영되던지 , 아니면 전쳐 반영되지 않아야 하며 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것으로 

즉  All or Nothing 의 개념으로서  작업 단위를 일부부만 실행하지 않는다는 것을 의미힌다.

 

트랜잭션이 원자성이라는 성질을 지니게 된 이유는 중간에 끊기게 되면 이후 해당 트랜잭션이 어디서부터 이어서 수행되어야 하는지 모르기 때문이다.

일관성

트랜잭션이 완료된 결괏값이 일관적인 DB 상태를 유지하는 것을 말한다.시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 한다.트랜잭션이 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들 뿐만 아니라, A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 한다는 사항과 같은 일관성 조건들도 있다. 

트랜잭션의 일관성은 기본키,외래키도 해당이 되는데 예를 들어 

 

Movie와 Video 테이블이 있을 때 Video 테이블의 기본 키(primary key)인 movie_id가 외래키로 존재한다고 가정한다. 만약 movie_id의 제약 조건이 Movie 테이블에서 변경되면, Video 테이블에서도 movie_id가 변경되어야 한다. 한 쪽의 테이블에서만 데이터 변경사항이 이루어져서는 안되는 것이다

 

고립성(=격리)

하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다. 

즉 , 트랜잭션 끼리는 서로를 간섭할 수 없다. 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다. 고립성은 격리성이라고도 하는데 이를 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다.

 

 고립성을 어떻게 보장하지? lock or unlock 을 통해 고립성을 보장한다.
트랜잭션은 데이터를 거나 슬 때는 문을 잠궈서 다른 트랜잭션이 접근하지 못하도록 한다.
수행을 마치면 언락(unlock)을 통해 데이터를 다른 트랜잭션이 접근할 수 있도록 허용한다.
트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수 는 있도록 허용하는 공유록 (shared_lock)을 한다.
데이터를 쓸때는 다른 트랜잭션이 읽을 수 도 쓸 수고 없도록 하는 베타록(exclusive_lock)을 사용한다.
lock 과 unlock 를 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있다.
즉 , 모든 트랜잭션이 아무것도 수행할 수 없는 상태가 되는 것이다. 


데드락 적절한 데이터 베이스 설계, 동시성 제어 메커니즘 및 트랜잭션 관리 방식은 데이터베이스 시스템에서 교착 상태를 효과적으로 방지하고 해결하는데 중요한다. 

transactional(readonly = true) 을 쓰는 경우도 이에 해당한다. 데이터에 대한 동시 엑세스를 관리하고 동시에 실행되는 여러 트랜잭션 간의 충돌을 방지하기 위함이다. 

 

https://hohojavis.tistory.com/64

 

데드락

데드락 -리소스 경합, 적덜한 동기화 부족, 잘못된 자원 할당, 순환 대기, 프로그래밍 오류로 인해 데드락이 발생된다. - 프로세스가 자원을 얻지 못해 다음 작업을 못하는 상태 데드락 발생조건

hohojavis.tistory.com

 

상태


 

트랜잭션에는 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋과 실패했을 때 시점으로 다시 되돌아가는 롤백이 있다.

  • 활동(Active) : 트랜잭션이 실행 중인 상태이다.
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태이다.
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태이다.
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태이다.
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태이다.

 

 

 

커밋

커밋연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과 정을 데이터베이스에 영구적으로 저장하는 것이다. 

롤백

롤백 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사함을 취소하는 명령어이다. 

 

세이브 포인트는 '임시저장' 또는 '부분저장' 과 같은 맥락으로 이해할 수 있다.  세이브 포인트는 여러개의 SQL 문의 실행을 수행하는 트랜잭션의 경우에서 사용자가 트랜잭션 중간 단계에서 세이브 포인트를 지정할 수 있다. 

세이브 포인트를 스려면 취소하려는 지점을 명시한 뒤, 그 지점가지 작업을 취소하는 식으로 사용하는데 이 지점을 세이브 포인트라고 한다. 세이브포인트를 지정한 뒤 롤백 투 세이브포인트 이름;(rollback to save point name;)을 실행하면 해당 세이브포인트 지점까지 처리한 직업이 롤백된다. 

 

스케쥴 종류 


직렬 스케쥴

-직렬 스케쥴은 순서대로 , 하나씩 트랜잭션을 실행하는 것 

-차례대로 실행하는 스케쥴로서 트랜잭션이 실행될시 다른 트랜잭션의 영향을 받을 수 없으므로 모순이 발생하지 않는다.

 

병행처리

-다수의 사용자가 데이터베이스에 요청을 보내게 되면 이러한 요청들을 처리할 방법이 필요하다. 

트랜잭션을 병행처리하면 처리 효율이 높아지지만, 처리 과정에서 동일한 자료를 동시에 접근해서 오류가 생길 수 있다.

이는 동시성 문제이며 그에 따른 해결책이 필요하다.

https://hohojavis.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F 

 

Tistory

좀 아는 블로거들의 유용한 이야기

www.tistory.com

 

 

 

http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98

https://mommoo.tistory.com/62

728x90