MY MEMO
[SQL SERVER] Transaction 본문
트랜젝션 : 하나의 논리적 작업 단위로 수행되는 일련의 작업 (전부 되거나 전부 안되거나)
트랜젝션을 써야 하는 이유
: 거래를 할때 구매자가 구매를 진행했는데 오류로 인하여 판매자는 돈이 입금되지 않은 경우
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 |