본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
Tech.log/데이터베이스

[트랜잭션이란?]

by SpaciousKitchen 2021. 5. 22.

트랜잭션

데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
  • SELECT
  • INSERT
  • DELETE
  • UPDATE

트랜잭션의 특징

원자성(Atomicity)
트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.
일관성(Consistency)
트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것

독립성(Isolation)
어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.
지속성(Durability)
트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점

 

트랜잭션의 Commit, Rollback 연산

 

- 커밋(Commit)
: 모든 부분작업이 정상적으로 완료하면 이 변경사항을 한꺼번에 DB에 반영합니다.

-롤백(Rollback): 
부분 작업이 실패하면 트랜잭션 실행 전으로 되돌립니다.하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스 일관성을 깨뜨렸을 때 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산입니다.


- SAVEPOINT

모든 연산을 취소하지 않고 정해진 부분까지만 되돌리고 싶을 때 사용하는 것이 savepoint
SAVEPOINT를 사용하면 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있습니다.
취소하려는 지점을 SAVEPOINT로 명시한뒤 ROLLBACK TO 세이브포인트이름;을 실행하면 지정한 해당 SAVEPOINT 지점까지 처리한 작업이 ROLLBACK됩니다.

 

 

 


활성(Active) : 트랜잭션이 정상적으로 실행중인 상태

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

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

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

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

 

트랜잭션의 LOCK

 

LOCK

Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법이다.

 

공유(Shared) Lock
공유 Lock은 데이터를 읽을 때 사용되어지는 Lock입니다. 이런 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능합니다. 즉, 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다라는 것입니다. 하지만 공유 Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없습니다.

베타(Exclusive) Lock
베타 Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지됩니다. 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없습니다. 또한 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없습니다.

 

  • 데이터베이스
    • 데이터베이스 범위의 lock은 전체 데이터베이스를 기준으로 lock 하는 것이다. 즉, 1개의 세션만이 DB의 데이터에 접근이 가능합니다. 해당 기능은 일반적으로는 사용하지 않습니다. 사용하는 때가 있다면 DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용합니다.
  •  파일
    • 데이터베이스 파일을 기준으로 lock을 설정합니다. 파일 이란 테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소 입니다. 해당 범위의 Lock은 잘 사용되지는 않습니다.
  • 테이블
    • 테이블 수준의 Lock은 테이블을 기준으로 Lock을 설정합니다. 이는 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용합니다. 즉, DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 합니다.
  • 페이지와 블럭
    • 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정합니다. 잘 사용되지는 않습니다.
  •  컬럼
    • 컬럼 기준의 Lock은 컬럼을 기준으로 Lock을 설정할 수 있습니다. 하지만 이 형식은 Lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지는 않습니다. 지원하는 DBMS도 많지 않습니다.
  • 행(Row)
    • 행 수준의 Lock은 1개의 행(Row)를 기준으로 Lock 설정을 합니다. DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock입니다.

블로킹(Blocking)

Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말합니다.

공유락 끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킵니다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야 합니다. 뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능합니다. 이런 경합은 성능에 좋지 않은 영향을 미칩니다. 따라서 경합을 최소화 할 필요가 있습니다.

ransaction commit 또는 rollback을 통해 해결해야한다.

 

블로킹 상태가 많을 수록, 사용자의 Latency는 길어지고, 불편함을 호소한다.

이것을 방지하지 위해 아래의 명령어를 사용한다.

SELECT * FROM USERS

SET LOCK_TIMEOUT 10000
GO

 

 

교착상태(DeadLock)

교착상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태를 말합니다.

 

 

예를 들어 보면, game_master, game_detail 테이블이 있습니다. 트랜잭션 A가 game_master 테이블에 5번 Row를 수정했고 이제 game_detail 테이블에 5번 Row를 이어서 수정하려고 합니다. 동시에 트랜잭션 B는 game_detail 테이블의 5번 Row를 수정하고 이어서 game_master 테이블의 5번 Row를 수정하려고 합니다. 이 경우 트랜잭션 A는 game_master 테이블의 5번 Row에 배타 락을 설정했고 트랜잭션 B는 game_detail 테이블의 5번 Row에 배타 락을 설정하였습니다. 그리고 교차로 트랜잭션 A는 game_detail의 5번 row의 Lock 설정을 하려고 하고 트랜잭션 B는 game_master의 5번 row에 Lock 설정을 하려고 합니다. 하지만 이미 각 row들은 서로다른 트랜잭션에 의해서 배타락 설정이 되어있습니다. 따라서 Lock이 해제되기를 서로 기다립니다. 하지만 이 Lock은 풀리지 않을 서로의 트랜잭션 기다리므로 영원히 풀리지 않을것입니다.

 

 

 Dead Lock을 감지하면 한쪽 Transaction을 풀어버린다. TRANSACTION A의 마지막 UPDATE 내용에 오류가 발생되고 COMMIT을 먼저 하도록 유도한다. TRANSACTION B는 아직 WAITING 상태로 남아있고, TRANSACTION A의 COMMIT을 기다리게 된다.

이것을 방지하기 위해

데드락 걸렸을 때, 아래와 같이 우선순위를 미리 정해준다.

트랜잭션 쿼리 안에 아래의 내용을 기입한다.

SET DEADLOCK_PRIORITY

 

더보기

데이터 베이스 의 용어

 

https://server-talk.tistory.com/159

 

 

  • 트랜잭션을 사용할 때 주의할 점

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
즉 트랜잭션의 범위를 최소화하라는 의미다. 일반적으로 데이터베이스 커넥션은 개수가 제한적이다.
그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다.
그러다 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있다.

 

 

 

'Tech.log > 데이터베이스' 카테고리의 다른 글

[NoSQL]  (0) 2021.05.22
[Statement VS Prepared Statement]  (0) 2021.05.22
[정규화]  (0) 2021.05.21
[Primary index vs Secondary index vs Composite index]  (0) 2021.05.21
[데이터 베이스]  (0) 2021.05.21

댓글