이 내용은 2011년 6월 현재 SQL2011(코드명 Denali) Beta를 기준으로 작성 되었으며
SQL2011(코드명 Denali) 공식버전(RTM) 발표까지 꾸준히 업데이트 예정입니다.
아울러, 현재 Beta버전이지만 강좌를 따라해
보시는데 아무 문제 없으실거에요. 도움 되시길
바랍니다.
==================================================================================================
안녕하세요. 이스트럭(강동운) 입니다.
오늘은 트랜잭션에 대한이해입니다.
원문: http://www.sqler.com/127366
트랜젝션에 대한 이야기 입니다. ^_^
트랜젝션에 대한 이야기는 많은 곳에서.. 이런 저런 이유로 들어
보셨을 겁니다.
프로그래밍을 하실때도 이 트랜젝션은 분명히 대단히 속도에 영향을 주는
요소 입니다.
특히나 데이터 수정이 있을 경우인 Insert, Update,
Delete를 잘못 수행했을 경우
대단히 많은 문제를 줄 수 있으며.. - CPU등의 시스템은
펑펑 놀고 있는데..
SELECT의 조회 속도가
대단히 느려지는 사태가 발생하는 겁니다.
이럴때는 한번쯤 트랜젝션 처리 모듈의 문제를 어플리케이션에서 점검을 해 보셔야
하지요. - 물론 마지막쯔~음에.. 문제상황인 블러킹이나 데드락을 막는 방법과..
어플리케이션을 개발하실때.. 주의에 주의를 거듭하셔야 하는
부분도
살짝 언급을 해 드릴겁니다.
이 장의 이름은 트랜젝션과 잠금처리인데요..
트랜젝션은 뭘까요? ^_^
늘 그랬던 것처럼.. 군더더기 없이 깔끔하게 알아 보도록
하지요.
트랜젝션은 작업의 단위를 지정해 주는 중요한 부분이기 때문입니다.
또한 트랜젝션은 SQL구문이나 쿼리를 실제로 처리할 경우의 가장
작은 단위 입니다.!!
은행이야기를 조금 해 볼까요?
코난이 계좌에 200원이 있고.... 수선이 계좌에 300원이 있다...
짤짤이에서 진 코난이가 100원을 수선이에게 잃어 200원중 100원을 온라인으로 계좌이체
를 시켜줘야 한다....
은행에사거 온라인으로 입금을 하기위해
1. 코난이 통장에서 100원을 뺌 - 코난이 통장 =
100원 수선이 통장 =
200원 2. 수선이 통장에 100원을 더함 - 코난이 통장 =
100원 수선이 통장 =
300원 |
하려고 했다...
그런데 웬일.. 정전이 나서...
1번 작업을 끝마치니 시스템이 죽었다...
"대우네 은행"에서 그당시 온라인으로 계좌 이체를 시킨 사람이 1000명이었다...
그 999명과 코난이는(도합 1000명) 이
문제를 어케할 것인가?
-_-;; 아마
기억하시는분들은.. MSSQL7 중급강좌의 트랜젝션 부분을 역시나..
손가락 두개로 컷 & 페이스트 한걸 아실 겁니다. -_-;;
양해하시고.. 저런 문제가 발생할 수 있지요.. !!!
저 내용을 우리가 사용하는 구문으로 살짝 돌려 본다면 이런 이야기가 될지 모릅니다.
update 계좌 set 금액 = 금액 - 100 where id like '코난' update 계좌 set 금액 = 금액 + 100 where id like '수선' |
하지만 위의 쿼리가 아닙니다!!!!!
SQL서버에서 위와 같은
처리를 위해서는 위처럼 쓰시면 안됩니다.
위와 같은 구문으로 쓰시면?
위의 쿼리는 다음과 같이 변환 됩니다.
begin tran update 계좌 set 금액 = 금액 - 100 where id like '코난' commit tran begin tran update 계좌 set 금액 = 금액 + 100 where id like '수선' commit tran |
이렇게 변화하게 됩니다. - 내부적으로 SQL서버의 엔진이 저렇게 바꾸는 겁니다.
그렇다면!!! 어떻게 해야.. 하나의 단위로.. 위 두개의 작업을 하나로 묶어서
수행하게
할 수 있을까요?
바로 다음과 같이 명시적으로 begin tran과 commit tran을 사용하시면 됩니다.
begin tran update 계좌 set 금액 = 금액 - 100 where id like '코난' update 계좌 set 금액 = 금액 + 100 where id like '수선' commit tran |
이렇게 사용하시면 두개의 작업이 하나의 단위로 처리가 되게 되지요.
별로 어렵지 않으실 겁니다. 그리고 이정도는 컴쪽의 일을
하신다면 한번쯔음~~
들어 보셨을 이야기일 거구요. 그럼 조금 다른 이야기로.. 내용을 돌려 보도록 하지요.
트랜젝션의 네가지 성격
트랜젝션은 DBMS차원에서.. 다음 네가지 성격을 만족해야만 합니다.
1. 원자성(atomicity) : 트랜젝션은 전부, 전무의 실행만이 있지.. 일부 실행으로
트랜젝션의 기능을 가질 수는 없다.
2. 일관성(consistency) : 트랜젝션이 그 실행을 성공적으로 완료하면 언제나
일관된
데이터베이스 상태로 된다라는 의미입니다.. 즉, 이 트랜젝션의 실행으로 일관성이
깨지지 않는다 라는 의미 이지요...
3. 격리성(isolation) : 연산의
중간결과에 다른 트랜젝션이나 작업이 접근할 수 없다..
라는 의미입니다.
4. 영속성(durability) : 트랜젝션의 일단 그 실행을 성공적으로 끝내면 그 결과를 어떠한
경우에라도 보장받는다.. 라는 의미입니다....
그렇다면 도대체~~ 저 어려운 단어들의 나열이 트랜젝션의
성격이라는 것은 알겠는데..
그 트랜젝션 이라는 녀석으로 과연 어떻게 문제가 생겼을때 데이터를 복구하냐??
이때는 UNDO와 REDO의 이야기가 나오게 됩니다.
우선 많이들 이야기 하시는 이야기로 알아 보지요.
장애(failure)와 회복(recovery)
회복(recovery)이란 장애(failure)가 일어났을 때 데이터 베이스를 장애 이전의 상태로
다시 복구 시켜 일관된 상태로(consistent state)로
복구 시키는 작업이지요
당연하지요? -_-;;
장애를 조금더 알아본다면? 관리자가 구두로 컴퓨터 파워 버튼을
실수로 차버리거나.
해서 문제가 생기는 상황?? 이렇게 대충은 생각이 가능하실
겁니다.
조금만 더 세분화를 시켜 본다면..
1. 트랜젝션 장애 : 트랜젝션 내의 논리적 오류나 내부조건, 입력 데이터의
불량, 데이터의 불명, 시스템 자원의 과다한 사용요구 등으로 정상적인
실행을 계속 할 수 없는 상태를 의미 합니다. 2. 시스템 장애 : 이는 하드웨어의 오동작으로 메인 메모리에 있는 정보의 손실이나 교착 상태가
발생하여 더 이상 실행을 계속할 수 없는
상태를 의미 하지요... 3. 미디어 장애 : 디스크 헤드 붕괴나 고장으로 인하야... 저장 장치의
데이터베이스 일부 또는 전부가 손상된 상태를 의미하구요 ^_^ |
이렇게 세분화가 가능해 집니다.
그렇다면 회복이라는 것은?
말 그대로 데이터를 안정된 상태로 복구 시키는 것을 의미하지요.
감사합니다.
[출처] SQLER.COM http://www.sqler.com/394741
SQL2011(코드명 Denali)
시리즈 강좌 리스트
[SQL2011강좌] 1.
코드명 Denali 설치 방법
[SQL2011강좌]
2. SSMS 접속 및 간단한 쿼리 실행
[SQL2011강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스 생성하기
[SQL2011강좌] 4. DDL 1탄: 테이블 생성
[SQL2011강좌] 5. DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가
및 삭제
[SQL2011강좌] 6. Primary
key와 Unique 제약조건
[SQL2011강좌]
7. DML 1탄 INSERT
[SQL2011강좌]
8. DML 1탄 INSERT(identity 속성)
[SQL2011강좌] 9. Sequence
[SQL2011강좌] 10. pubs, northwind Database 예제 설치
[SQL2011강좌] 11. SELECT(단일 테이블)
[SQL2011강좌] 12. SELECT(JOIN)
[SQL2011강좌] 13. UPDATE, DELETE
절
[SQL2011강좌] 14. DISTINCT,
UNION, UNION ALL 키워드
[SQL2011강좌] 15. ORDER BY, GROUP BY, HAVING
[SQL2011강좌] 16. SubQuery(서브쿼리)
[SQL2011강좌] 17. 뷰에 대한 이해 및 생성, 수정,
삭제
[SQL2011강좌] 18. 저장 프로시저에 대한
이해, 생성, 수정, 삭제
[SQL2011강좌] 19.
인덱스에 대한 이해
[SQL2011강좌] 20.
클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011강좌] 21. 트랜잭션에 대한이해
[SQL2011강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011강좌] 23. 잠금에 대한 이해
[SQL2011강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그 백업)
[SQL2011강좌] 25. 백업과 복구 전략
[SQL2011강좌] 26. 커서란?
SQL2011(코드명 Denali) 시리즈
동영상 강좌 리스트
[SQL2011 동영상 강좌] 1. 코드명 Denali 설치 방법
[SQL2011 동영상 강좌] 2.
SSMS 접속 및 간단한 쿼리 실행
[SQL2011 동영상 강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스
생성하기
[SQL2011 동영상 강좌] 4. DDL 1탄: 테이블 생성
[SQL2011 동영상 강좌] 5.
DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011 동영상 강좌] 6. Primary key와 Unique
제약조건
[SQL2011 동영상 강좌] 7. DML 1탄 INSERT
[SQL2011 동영상 강좌] 8.
DML 1탄 INSERT(identity 속성)
[SQL2011 동영상 강좌] 9. Sequence
[SQL2011 동영상 강좌] 10.
pubs, northwind Database 예제 설치
[SQL2011 동영상 강좌] 11. SELECT(단일 테이블)
[SQL2011 동영상 강좌] 12.
SELECT(JOIN)
[SQL2011 동영상 강좌] 13. UPDATE, DELETE 절
[SQL2011 동영상 강좌] 14.
DISTINCT, UNION, UNION ALL 키워드
[SQL2011 동영상 강좌] 15. ORDER BY, GROUP BY,
HAVING
[SQL2011 동영상 강좌] 16. SubQuery(서브쿼리)
[SQL2011 동영상 강좌] 17.
뷰에 대한 이해 및 생성, 수정, 삭제
[SQL2011 동영상 강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제
[SQL2011 동영상 강좌] 19.
인덱스에 대한 이해
[SQL2011 동영상 강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011 동영상 강좌] 21.
트랜잭션에 대한이해
[SQL2011 동영상 강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011 동영상 강좌] 23.
잠금에 대한 이해
[SQL2011 동영상 강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그
백업)
[SQL2011
동영상 강좌] 25. 백업과 복구 전략
[SQL2011 동영상 강좌] 26. 커서란?
'프로그램&DB > MS-SQL' 카테고리의 다른 글
[MS-SQL2011강좌] 23. 잠금에 대한 이해 by 강동운님 (0) | 2011.08.23 |
---|---|
[MS-SQL2011강좌] 22. 트랜잭션의 격리수준 4가지 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 19. 인덱스에 대한 이해 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제 by 강동운님 (0) | 2011.08.23 |