본문 바로가기

Database/MSSQL work

트랜젝션(transaction)

-- 하나의 db에서 이루어지는 논리적인 작업단위
-- MS는 오토커밋 시스템으로 oracle과 다르게 commit할 필요없고 Rollback()도 불가능

-- C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA 
-- 8k 기준으로 파일관리
-- ldf : log 파일
-- mdf : 실제 데이터 파일

 

 

 

 

 

-- 트랜젝션이 3번 실행됨

update customersTbl set addr = '천안' where custId = 'aaaaaaaa';
update customersTbl set addr = '천안' where custId = 'kkkkkkkk';
update customersTbl set addr = '천안' where custId = 'ffffffff';

 

 

 

 

-- 하나의 트랜젝션으로 묶어 실행 (log파일에 하나씩 복구/저장 해놓음: 다되면 check point표시)

BEGIN TRAN
update customersTbl set addr = '천안' where custId = 'aaaaaaaa';
update customersTbl set addr = '천안' where custId = 'kkkkkkkk';
update customersTbl set addr = '천안' where custId = 'ffffffff';
COMMIT TRAN
-- ROLLBACK TRAN
-- (ROLLFORWARD)

 

 

 

 

 

 

-- 연습

create table testTbl (num int);

go

insert into testTbl values(1);
insert into testTbl values(2);
insert into testTbl values(3);

 

--트랜젝션 테스트

--1
begin tran
--2
update testTbl set num = 10 where num = 1;
--3
update testTbl set num = 20 where num = 2;
update testTbl set num = 30 where num = 3;
--4
commit tran

-->test : 트랜젝션을 1개 돌리는 중에 
-- 고의적으로 구성관리자에서 실행 중지시킨 후 확인하면 트랜젝션 카운트가 0이 된다

 

 

 

 

 

 

-- 현재 세션에서 물려있는(진행중인) 트랜젝션의 수를 출력

select @@TRANCOUNT;

 

 

 

 

 

-- *트랜잭션 특징 ( ACID )

-- 1. Atomicity : 트랜젝션은 분리 할 수 없는 하나의 단위로 실행되어야 한다. (ALL or Nothing)
-- 2. Consistency : 트랜젝션에서 사용되는 모든 데이터는 일관적이어야 한다
-- 3. Isolation : 현재 트랜젝션이 접근하고 이쓴 데이터는 다른 트랜젝션에서 격리되어야 한다.(엉킴 방지)
-- 4. Durability : 트랜젝션이 정상적으로 종료된다면 그 결과는 
--시스템 오류가 발생하더라도 시스템에 영구적으로 적용된다.

 

 

 

 

 

 

-- *트랜젝션의 종류
-- INSERT, UPDATE, DELETE, SELECT, ALTER TABLE,
-- FETCH, REVOKE, CREATE, FRANT, TRUNCATE TABLE, DROP, OPEN 등

-- 1. 자동 커밋 트랜잭션 : SQL Server의 기본 셋팅
-- 2. 명시적 트랜젝션 : BEGIN TRAN..... COMMIT TRAN
-- 3. 암시적 트랜젝션 : BEGIN TRAN은 자동  COMMIT TRAN은 수동 
-- SET IMPLTCIT_TRANSACTIONS ON

 

 

 

 

 

 

 

 

 

 


-- 계좌송금 실패 연습

create table bankBook(
	userName nvarchar(10),
	userMoney int,
	constraint ck_money check(userMoney >= 0)
);
go

insert into bankBook values(N'나대리', 1000);
insert into bankBook values(N'박대리', 0);


update bankBook set userMoney = userMoney + 500 where userName = N'나대리';
update bankBook set userMoney = userMoney + 500 where userName = N'박대리';

 

 

 

 

 

 

 

 

--되돌리기 ( rollback)

 

tran문을 try and catch로 묶어주면 된다

begin try
	begin tran
	update bankBook set userMoney = userMoney - 500 where userName = N'나대리';
	update bankBook set userMoney = userMoney - 500 where userName = N'박대리';
	commit tran
end try
begin catch
	rollback tran
end catch

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Database > MSSQL work' 카테고리의 다른 글

커서 cursor  (0) 2020.11.13
저장 프로시져 procedure  (0) 2020.11.12
#, ##  (0) 2020.11.11
View  (0) 2020.11.11
인덱스 index  (0) 2020.11.11