MY MEMO

[SQL SERVER] Transaction 본문

STUDYING/SQL SERVER

[SQL SERVER] Transaction

l_j_yeon 2018. 3. 16. 13:18

트랜젝션 : 하나의 논리적 작업 단위로 수행되는 일련의 작업 (전부 되거나 전부 안되거나)

트랜젝션을 써야 하는 이유

: 거래를 할때 구매자가 구매를 진행했는데 오류로 인하여 판매자는 돈이 입금되지 않은 경우


Database는 DB이름을 치지만 실제로는 파일 이름으로 존재한다 (*.mdf : 데이터 파일 / *.ldf : 트랜젝션 로그파일)


원래 데이터베이스는 논리적 데이터베이스 -> 물리적 데이터베이스

논리적 데이터베이스에서 쿼리를 날리면 일단 로그에 기록을 남기고 실제 데이터를 변경한다


트렌젝션을 생성하는 쿼리

: BEGIN TRANSACTION (또는 BEGIN TRAN)

SQL 문장

COMMIT TRANSACTION (또는 COMMIT TRANS or COMMIT WORK)


실제로 쿼리를 실행하면 자동으로 트렌젝션을 생성(AUTO TRANSACTION)하고 BEGIN / COMMIT Tran을 한다 -> 로그를 남기기 위하여

+) 암시적 트랜잭션 -> 쿼리가 나오면 자동으로 BEGIN TRANS을 붙이지만 COMMIT TRAN 혹인 ROLLBACK TRAN은 직접 써줘야 한다

SET IMPLICIT_TRANSACTION ON


COMMIT TRANS를 하는 과정


이 과정이 정상인데 만약에 중간에 정전이 났다면?


1) BEGIN TRAN 을 썼는데 정전이 났다면 -> BEGIN TRAN만 삭제 (ROLL BACK)

2) UPDATE 1->11까지 썼는데 정전이 났다면 -> 싹다 삭제 (ROLL BACK)

3) 만약 모두 다 로그파일에 썼는데 데이터 변경 전 정전이 났다면 -> 체크포인트가 없으므로 모두 다시 실행 + 체크포인트 표시 (ROLL BACK)


+) TRANSACTION이 끝나지 않았는데 Table에 접근하려고 하면 접근이 되지 않음 (해당 TRANSACTION이 모두 끝나야 가능)


하지만

ALTER DATABASE sqlDB SET ALLOW_SNAPSHOT_ISOLATION ON;

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

: 지금 현재 transaction이 진행되고 있더라도 SELECT문을 실행할 수 있게 해주세요

을 이용하면 SELECT 할 수 있다.


ALTER DATABASE sqlDB SET ALLOW_SNAPSHOT_ISOLATION OFF;


SELECT @@trancount; 

: 몇개의 transaction이 진행 중인지 알 수 있음


SAVE TRAN 트랜잭션_이름

: 임의로 생성한 트랜잭션 저장


BEGIN CATCH

ROLLBACK TRAN

END CATCH

: ROLLBACK 하는 쿼리




'STUDYING > SQL SERVER' 카테고리의 다른 글

[SQL SERVER] Cursor  (0) 2018.03.19
[SQL SERVER] 저장 프로시저와 사용자 정의 함수  (0) 2018.03.16
[SQL SERVER] Index  (0) 2018.03.16
[SQL SERVER] Table & View  (0) 2018.03.15
[SQL SERVER] Transact SQL 고급  (0) 2018.03.15
Comments