반응형

 이번에 설명한 내용을 MSSQL의 Transaction입니다. 

 설명에 앞서 우리가 사용하는 MSSQL 데이터베이스에 대해서 생각해 본다면  

 SQL 서버에 그림과 같이 데이터 베이스가 생성되어 있고 

 사용자가 데이터베이스에 조회 요청을 하면 일반적으로 사용자는 아래의 그림과 같이

 결과를 전달 받는다고 생각합니다. 

논리적 데이터 베이스 구조

 이것은 우리가 논리적으로 생각하는 데이터 베이스의 모습입니다.

 하지만 데이터라면 어딘가에 저장되어 있어야 합니다. 물리적인 데이터 베이스는 어떻게 구성되어 있을까요?

 버전별로 다르겟지만 "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA" 위치로 

 이동하게 되면 mdf, ldf 파일이 존재하는 것을 확인 할 수 있습니다. 

 이것이 물리적 데이터 베이스의 구조입니다. 

 실제적으로는 아래 그림과 같이 논리적 + 물리적인 구조로 구성되어 있습니다.

논리적 + 물리적인 데이터 모습

 실제로 데이터 파일이 기록이 될 때는 페이지 단위로 구성되며 8개의 페이지를 묶어서 익스텐트라는 단위로

 관리합니다. 자세한 내용은 아래에 링크를 통해서 확인 할 수 있습니다. 

https://jungwoong.tistory.com/32?category=1073468

 

SQL Server의 데이터 관리

데이터베이스에서 데이터 파일에 할당되는 디스크공간은 논리적인 페이지로 나뉘면서 연속적인 숫자가 페이지에 매겨집니다. Page(페이지) 책이 page로 구성되어 있는 것처럼 SQL 서버의 Page로 구성되어 있으며..

jungwoong.tistory.com

 그리고 실제로 데이터가 기록될 때 SQL 서버는 Transaction 로그파일도 순차적으로 기록합니다.

 (LSN : 시퀀스 번호, Transaction ID)

 Transaction 로그파일은 페이지 단위로 구성되지 않습니다. 

 

 실제로 어떻게 데이터를 조회 및 변경이 진행되는지 예제를 통해 확인 해 봅시다.

 SELECT 구문을 실행하게 되면 데이터 변경이 발생하지 않기 때문에 Transaction 작업은 발생하지 않고

 데이터 조회 및 결과 정보만 전달 받는 동작만 실행 됩니다.

SELECT 데이터 조회

 

 INSERT 구문을 실행은 다르게 동작합니다.

 데이터 변경이 발생하기 때문에 데이터 변경 기록 및 Transaction 로그를 기록 하게 됩니다. 

 (UPDATE, DELETE도)

데이터 변경 적용 과정

 실제 데이터를 변경할 때 Transaction 로그 기록은 데이터 저장과는 전혀 상관없고 추가적인 비용만 발생되는데 

 왜 로그를 기록하는 걸까요? 그 이유는 데이터 베이스의 무결성을 지키기 위해서 입니다. 

 무결성을 설명하기 위해서 은행의 계좌이체를 예를 들어서 설명 드리겠습니다.

 

 A가 B에게 100만원을 송금해주는 작업을 진행한다면 아래 그림과 같이 "금액차감 -> 금액 전송 -> 금액 추가" 

 흐름대로 진행될 것입니다. 그런데 예상치 못한 상황(네트워크 에러, 지진, 정전등)으로 2번을 진행하는 도중에

 작업이 멈췄다면 A의 통장에서는 100만원이 차감되고 그 돈의 행방을 알 수 없게 될 것입니다.

 이럴 때에 Transaction 로그 기록을 기준으로 장애를 복구하여 데이터 베이스의 무결성을 제공합니다. 

 실제로 Transaction이 어떻게 기록되어 있는지 확인하려면 아래의 쿼리문을 입력하면 Transaction ID별로

 기록된 정보를 확인 할 수 있습니다. 

SELECT [Current LSN], [Transaction ID], [Operation], [Previous LSN], [Transaction Name]
FROM sys.fn_dblog(NULL, NULL)
WHERE [Transaction ID] = '0000:000003c2'

 

실제로 Transaction 사용하는 방법 정리 해야 한다.!

반응형

'MSSQL' 카테고리의 다른 글

[설치] SQL Server 2019 Developer 설치하기  (0) 2022.08.26
[MSSQL] 인덱스의 내부 동작 방식  (0) 2019.11.16
[MSSQL] 인덱스(Index)  (0) 2019.11.04
SQL Server의 데이터 관리  (0) 2019.11.04

+ Recent posts