-- 하나의 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 |