트랜잭션이란 ?
트랜잭션은 데이터베이스에 저장된 데이터를 변경하는 명령문의 집합이다. 예전에 포스트한 글에도 개념 설명이 있지만 여기서도 또 나온다. 트랜잭션은 단일 작업 단위로 취급된다.
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
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 |
'Database > SQL Server' 카테고리의 다른 글
SQL Server - Except 연산자(operator) (0) | 2020.12.11 |
---|---|
SQL Server - 데이터베이스 교착 상태 Database Deadlock (0) | 2020.12.11 |
SQL Server - SQL 서버 합치기 Merge in SQL Server (0) | 2020.12.10 |
SQL Server - 파라미터 옵션(NULL값 True) 주고 실전에 사용하기 (0) | 2020.12.10 |
SQL Server - 재사용 가능한 스크립트 Re-runnable sql server script (0) | 2020.12.10 |