Database/SQL Server

SQL Server - 동시에 일어나는 트랜잭션 Concurrent Transactions

청렴결백한 만능 재주꾼 2020. 12. 10. 09:52
반응형

트랜잭션이란 ? 

트랜잭션은 데이터베이스에 저장된 데이터를 변경하는 명령문의 집합이다. 예전에 포스트한 글에도 개념 설명이 있지만 여기서도 또 나온다. 트랜잭션은 단일 작업 단위로 취급된다. 

A transaction is a group of commands that change the data stored in a database. A transaction, is treated as a single unit of work.

 

동시에 일어나는 트랜잭션은 은행으로 예를 들어 생각하면 쉽다. 

-- Transfer $100 from Mark to Mary Account
BEGIN TRY
 BEGIN TRANSACTION
  UPDATE Accounts SET Balance = Balance - 100 WHERE Id = 1
  UPDATE Accounts SET Balance = Balance + 100 WHERE Id = 2
 COMMIT TRANSACTION
 PRINT 'Transaction Committed'
END TRY
BEGIN CATCH
 ROLLBACK TRANSACTION
 PRINT 'Transaction Rolled back'
END CATCH

동시에 일어나는 트랜잭션의 문제점 Common concurrency problems

 -  Dirty Reads

하나는 커밋되었는데 하나가 커밋이 안되어서 결과가 다르게 나오는 것

 

- Lost Updates

동시에 입금을 했는데 하나의 트랜잭션이 사라져 잔액이 총합이 아닐때 

 

 - Nonrepeatable Reads

한개의 트랜잭션이 진행 중일 때 다른 트랜잭션에서 Update를 했는데 진행 중인 트랜잭션에 영향을 줄 때 발생

 

 - Phantom Reads

WHERE절에 조건이 주어진 트랜잭션이 진행 중일때 insert로 다른 트랜잭션에서 넣었을 때 발생. 이상한 레코드가 나옴.

 

SQL Server에서 지정할 수 있는 트랜잭션 격리 레벨 SQL Server Transaction Isolation Levels

 - Read Uncommitted (가장 낮은 격리 수준)

 - Read Committed

 - Repeatable Read 선행되는 트랜잭션 레벨로 지정하면 진행 중 읽고 있는 데이터의 업데이트나 삭제가 불가능함

 - SnapShot

 - Serializable

 

Isolation Level별 부작용 여보

SnapShot 과 Serializable의 차이

둘 다 모든 부작용을 막을 수 있는 레벨이다. 

직렬화(Serializable) 는 말그래도 동시성(병렬)을 해치는 말이다. 현재 진행중인 트랜잭션의 리소스를 모두 잠금하고 끝난 후 푼다.동시성의 의미를 잃어버리게 하지만 순차적인 진행으로 동시성으로 생길 수 있는 모든 부작용을 막을 수 있다.

 

스냅샷(SnapShot)은 트랜잭션의 실행 스냅샷을 임시 데이터베이스(Temp DB)에 저장시켜 버전관리를 한다. 스냅샷은 리소스를 잠금하지 않고 직렬화와 가까운 구분을 제공하면서 데이터의 일관성을 유지한다. 

 

 

스냅샷 격리는 두가지의 방법으로 제어 가능하다.

 - READ_COMMITTED_SNAPSHOT 데이터베이스 옵션

    READ COMMITTED 격리 수준에서 Dirty Read와 Non-Repeatable Read를 피하기 위해서 잠금을
       사용하는 대신, 행 버전 관리를 사용하도록 합니다.

 

 

- ALLOW_SNAPSHOT_ISOLATION 데이터베이스 옵션

이 옵션을 설정한 뒤, SET TRANSACTION ISOLATION LEVEL SNAPSHOT 세션 옵션을 설정하면
       해당 세션에서 스냅숏 격리 수준이 적용됩니다

 

 

커밋된 스냅샷 읽기
Read Committed Snapshot Isolation
스냅샷 격리
Snapshot Isolation
업데이트할때 충돌 없음
No update conflicts
업데이트할 때 충돌 취약
Vulnerable to update conflicts
기존 어플리케이션을 딱히 고치지 않아도 함께 쓸 수 있다 
Works with existing applications without requiring any change to the application
기존 어플리케이션과 함께 쓰려면 수정이 필요하다
Application change may be required to use with an existing application
분산 트랜잭션과 함께 사용 가능
Can be used with distributed transactions
분산 ;트랜잭션과 함께 사용 할 수 없음
Can not be used with distributed transactions
Statement 수준의 읽기 일관성 가능
Provides statement-level read consistency
트랜잭션 수준 읽기 일관성 가능
Provides transaction-level read consistency
반응형