1. 트랜잭션(Transaction)의 정의
"트랜잭션(Transaction)" 이란, 작업 단위를 말하며, 여기에는 데이터를 쿼리하고 변경하는 다양한 작업뿐만 아니라
데이터의 정의를 변경하는 작업도 포함된다.
"트랜잭션(Transaction)"의 개념을 쉽게 풀어보면
"하나의 논리적 단위로 수행되는 일련의 작업" 이라고 볼 수 있다.
이 의미에서 "전부 되거나, 전부 안되거나"의 의미가 포함되어 있다.
트랜잭션의 경계는 명시적으로 지정할 수도 있고, 암시적으로 지정할 수도 있다.
명시적으로는 트랜잭션이 시작되는 부분에 BEGIN TRAN (Begin Transaction) 구문을 사용해서 정의한다.
명시적으로 트랜잭션의 마지막 부분에서는 해당 트랜잭션이 정상적으로 처리가 되었다고 확인되면
COMMIT TRAN(COMMIT TRANSACTION)을, 그렇지 않고 트랜잭션의 이전 상태로 복구하고 싶으면
ROLLBACK TRAN(ROLLBACK TRANSACTION)을 지정하면 된다.
BEGIN TRAN
<쿼리문>
COMMIT TRAN || ROLLBACK TRAN
만약 트랜잭션의 경계를 명시적으로 표시하지 않는다면,
SQL Server 는 기본적으로 개별 구문마다 트랜잭션으로 묶어서 처리하게 된다.
즉, 기본적으로 SQL Server 는 개별 구문이 실행될 때마다 자동으로 커밋을 수행하게 된다.
트랜잭션은 원자성(Automicity), 일관성(Consistency), 격리성(Isolation), 영속성(Durability) 이라는 네 가지 특성을 가지고 있다.
각각의 첫 글자를 따서 ACID라고 표현한다.
1) 원자성(Automicity) : All or Nothing
트랜잭션은 하나의 작업 단위로 처리된다.
트랜잭션 내에서는 모든 구문이 처리되거나 모두 처리되지 않거나 둘중 하나만 가능하다.
트랜잭션이 완료되기 전에(트랜잭션 로그에 커밋 정보가 저장되기 전에) 시스템에서 문제가 발생하면
시스템이 다시 시작되면서 SQL Server는 자동으로 발생된 모든 변경사항을 다시 원래 상태로 돌려놓는다.
또한, 트랜잭션 내에서 오류가 발생되면, SQL Server는 몇 가지 예외적인 경우들을 제외하고는
일반적으로 트랜잭션을 롤백한다.
2) 일관성(Consistency)
일관성이라는 의미는 RDBMS가 동시 트랜잭션 형태로 데이터를 변경하고 조회할 수 있도록 제공하는 데이터의 상태를 말한다.
"일관성" 이라는 단어는 주관적인 용어이기 때문에 애플리케이션의 필요에 따라 달라질 수 있다.
일관성은 데이터베이스가 제약조건(기본키, 고유 제약 조건,참조키 등)을 통해 정의되는
무결성의 규칙을 따라야함을 의미하는 용어이기도 하다.
예를들어 게시판에 글을쓰는데 제약조건이 255글자인데 256 글자를 쓰게되면
제약조건을 위반하는 트랜잭션이므로 거부해야 한다.
3) 격리성(Isolation)
격리성이란, 트랜잭션 작업 수행 중에는 다른 트랜잭션에 영향을 주어서도 안되고,
다른 트랜잭션들에 의해 간섭을 받아서도 안된다는 것을 의미한다.
다른 트랜잭션의 영향을 받게 되면, 영향을 주는 트랜잭션에 의해 자신의 동작이 달라 질 수 있기 때문에,
트랜잭션 자신은 고립된 상태에서 수행되어야 한다는 것을 의미한다.
SQL Server는 격리 수준을 관리하는 방법으로 두 가지 모델을 제공한다.
하나는 잠금과 관련된 전통적인 방식이며, 다른 하나는 행 버전 관리를 사용하는 새로운 방식이다.
On-Premises SQL Server에서는 잠금을 기반으로 하는 모델을 기본으로 한다.
이 모델에서는 데이터를 읽고자 할 때 공유 잠금(S-LOCK)을 필요로 한다.
데이터의 동시 상태가 일치하지 않으면 데이터가 일관된 상태로 될 때까지 읽기 작업은 차단된다.
Window Azure SQL 은 행버전을 기반으로 작업에서 공유 잠금을 설정하지 않아도 되며, 기다릴 필요도 없다.
데이터의 현재 상태가 일관되지 않으면 읽기 작업은 이전의 일관된 상태의 값을 읽어가게 된다.
4) 영속성(Durability)
데이터 베이스의 변경사항은 항상 디스크에 있는 데이터베이스의 데이터 파일에 저장되기 전에
데이터베이스 트랜잭션 로그 파일(*.ldf)에 기록된다.
디스크에 있는 트랜잭션 로그에 커밋 명령이 기록되면,
변경사항이 디스크의 데이터 부분에 아직 기록되지 않더라도 트랜잭션이 영속된다고 간주한다.
시스템이 시작되면, 정상적으로 종료되었든지 시스템 문제로 인해 실패로 종료되었든지 상관없이
SQL Server는 각각의 데이터베이스의 트랜잭션 로그 파일을 검사한 다음 실행 또는 취소로 처리 작업을 수행한다.
실행 단계에서는 커밋 명령이 로그에 쓰였지만
아직 변경 사항이 데이터 부분에 기록되지 않은 모든 트랜잭션에 대해서는 롤포워드(rollfoward : 재생) 작업을 수행한다.
취소 단계에서는 트랜잭션의 커밋 명령이 아직 로그 파일에 기록되지 않은 모든 변경사항을 롤백(rollback : 취소) 하게 된다.
2. 트랜잭션의 작동방식
트랜잭션의 작동방식을 순서대로 알아보자.
BEGIN TRAN
UPDATE 1 -> 11
UPDATE 2 -> 22
UPDATE 3 -> 33
COMMIT TRAN
1) BEGIN TRAN 과정
1-1) BEGIN TRAN 문장을 실행하면 지금부터 트랜잭션을 시작하는것으로 간주되고,
1-2) 로그파일 처음이나 마지막 체크포인트 이후에 로그 일련번호와 트랜잭션 아이디가 이어서 기록된다.
2) UPDATE 1->11 과정
2-1) UPDATE 1->11이 실행
2-2) 데이터파일에 실제로 존재하는 데이터인 '1'을 데이터 캐쉬로 로딩함.
2-3) 데이터 캐시의 '1'의 값을 '11'로 변경함.
2-4) "UPDATE 1->11" 과 로그 일련번호, 트랜잭션 아이디를 함께 로그 파일에 기록한다.
3) UPDATE 2->22 / UPDATE 3->33 과정
3-1) 위의 UPDATE 1 -> 11 과 같은 과정을 거친다.
여기서 주의하면서 볼것은 아직 데이터파일(*.mdf)는 값이 바뀌지 않았다는 것이다.(COMMIT 전이므로)
4) COMMIT TRAN 과정
4-1) COMMIT TRAN 실행.
4-2) COMMIT TRAN 문장을 로그 일련번호, 트랜잭션 아이디와 함께 로그 파일(*.ldf)에 기록.
4-3) 데이터 캐쉬의 변경된 데이터(1->11,2->22,3->33)을 차례대로 데이터파일(*.mdf)에 적용시켜 데이터 변경
4-4) COMMIT TRAN으로 다음으로 새로운 체크포인트 설정
3. 트랜색션 별 롤백/롤포워드 방식(**)
'DB ARCHITECTURE' 카테고리의 다른 글
[MSSQL] 격리수준 (0) | 2021.12.16 |
---|---|
[MSSQL] LOCK (0) | 2021.12.16 |
SQL-SERVER SCHEDULER : sqlserver 스케쥴러(2) (7) | 2021.12.15 |
SQL-SERVER SCHEDULER : sqlserver 스케쥴러(1) (0) | 2021.12.15 |
SQL-SERVER SCHEDULER : 윈도우 스케쥴러 (0) | 2021.12.15 |