Download presentation
Presentation is loading. Please wait.
Published byΌσιρις Σέλευκος Αντωνόπουλος Modified 5년 전
1
YOU Youngseok yys@kangwon.ac.kr
트랜잭션(Transaction) YOU Youngseok
2
트랜잭션 데이터베이스 시스템에서 최소의 업무처리 단위 SQL문의 하나의 논리적 작업 단위로 성공하거나 실패하는 일련의 SQL문
오라클 서버는 트랜잭션을 기본으로 데이터의 일관성을 보증
3
트랜잭션 1 2 3 4 5 6 7 8 트랜잭션 개별적으로는 트랜잭션이 아님 모두 모여 하나의 트랜잭션
데이터베이스 시스템에서 최소의 업무처리 단위 1 2 3 4 5 6 7 8 트랜잭션 개별적으로는 트랜잭션이 아님 모두 모여 하나의 트랜잭션
4
SQL DDL (Data Definition Language) DML (Data Manipulation Language)
CREATE ALTER DROP TRUNCATE DML (Data Manipulation Language) SELECT INSERT DELETE UPDATE DCL (Data Control Language) COMMIT ROLLBACK GRANT: 사용자 권한 부여 REVOKE: 사용자 권한 취소
5
커밋과 롤백 커밋과 롤백은 DCL(Data Control Language)이다. 커밋(Commit) 롤백(Rollback)
트랜잭션에 의해 변경된 데이터에 대해 확정하는 문장 수행된 모든 문장에 대한 데이터의 변경 사항을 영구적으로 반영 실행 후 트랜잭션이 종료됨 롤백(Rollback) 트랜잭션의 변경을 취소하는 문장 세이브 포인트(Save Point) 트랜잭션의 특정위치로 롤백하는 문장
6
실습 테이블 Table Name: trantest
7
Commit & Rollback SQL 1 SQL 2 SQL 3 COMMIT 트랜잭션 트랜잭션 시작 트랜잭션 종료 ROLLBACK
8
Commit & Rollback
9
SAVE POINT SQL 1 SQL 2 SQL 3 COMMIT 트랜잭션 트랜잭션 시작 트랜잭션 종료 ROLLBACK TO A
부분적인 롤백을 가능하게 하기 위해 트랜잭션에 대한 중간 점을 정의 SQL 1 SQL 2 SQL 3 COMMIT 트랜잭션 트랜잭션 시작 트랜잭션 종료 ROLLBACK TO A SAVEPOINT A
10
SAVE POINT
11
오라클 아키텍처에 대한 대략적 설명
12
Redo & Undo segment Redo (다시하기) – Update 실행과정에서 알 수 있으니 Update 쿼리 실행과정을 보자
13
Redo & Undo segment Redo (다시하기) – Update 실행과정에서 알 수 있으니 Update 쿼리 실행과정을 보자
14
Redo & Undo segment Redo (다시하기) – Update 실행과정에서 알 수 있으니 Update 쿼리 실행과정을 보자
15
Redo & Undo segment Redo (다시하기) – Update 실행과정에서 알 수 있으니 Update 쿼리 실행과정을 보자 Redo Log file? : Redo log file은 Redo log buffer에 기록된 내용을 기록해 두는 파일이다. 장애가 발생시 Redo Log file을 보고 DB를 복구하게 된다. Commit? : Commit명령문을 실행시킨다고 디스크에 변경사항이 반영되지 않는다. Commit을 실행시키면 Redo Log Buffer에 있는 내용을 Redo File에 쓰게 되고, Redo File이 어느 정도 차거나, 시간이 일정시간 지나면 디스크에 변경사항을 저 장한다. SCN(System Commit Number) : Oracle은 Commit이 발생하게 되면 각각의 트 랜잭션(Commit이 트랜잭션 단위이니까)에 고유 번호를 부여하게 되는데 이 번호 가 SCN이다. Undo data : Undo Segment에 있는 data를 의미한다. 데이터를 복구하거나 회복 할 경우 사용한다.(또는 SCN을 비교해서 데이터를 참고할 때)
16
Oracle의 두가지 모드 Consistent vs Current
Consistent는 말 그대로 일관된 읽기! Commit을 수행한 후 Redo log file에 있는 내용을 읽는 것을 의미한다. Current는 현재 데이터를 읽는 것을 의미하는데 현재 Update나 Insert를 수행한 데이터를 읽는 것을 의미한다. - 참고 사이트 주소
17
동시성 제어 트랜잭션이 동시에 수행 되면 발생할 수 있는 문제
Lost Update(갱신 손실): 갱신 내용을 잃어버림 Dirty Read(오손 판독): 존재하지 않는 값을 읽음 Non-Repeatable Read(비반복 읽기): 여러 번 읽을 때 값이 서로 다름 Phantom Read(유령 읽기): 읽는 범위 내에 존재하는 삭제/삽입된 유령 레코드를 읽음/읽지 못함 트랜잭션 고립 수준 명령어(transaction isolation level instruction) DBMS는 트랜잭션을 동시에 실행시키면서 Lock보다 좀 더 완화된 방법으로 문제를 해결하기 위해 제공하는 명령어 Oracle에서는 READ COMMITTED(Default), SERIALIZABLE 만 사용가능 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 문제 고립 수준 Dirty read Non-Repeatable Read Phantom Read READ UNCOMMITTED 가능 READ COMMITTED 불가능 REPEATABLE READ SERIALIZABLE
18
SQL Developer을 2개 실행 SET autocommit OFF; commit;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
19
갱신 손실 곰돌이 시간 힌둥이 Update 통장 set money = 10만 Where 이름 = 커플통장 T1 T2
뭐야 왜 5만원으로 되어있지? T3
20
트랜잭션 고립 수준 실습 Lost Update(갱신 손실)이 생기지 않는 실험 트랜잭션 T1 READ COMMITTED 모드
SELECT * FROM trantest WHERE empID = 'A002'; UPDATE trantest SET empName = '임꺽정' WHERE empID = 'A002'; UPDATE trantest SET empName = '강만중' --Wait; ROLLBACK; COMMIT;
21
비반복 읽기 문제 곰돌이 시간 힌둥이 Select money from 통장 Where 이름 = 커플통장 T1 T2
Update 통장 set money +=5만 Where 이름 = 커플통장; Commit; T3 뭐야 왜 5만원이 더 들어 있지? T4
22
트랜잭션 고립 수준 실습 Non-Repeatable Read(비반복 읽기) 문제 발생 실험 트랜잭션 T1
READ COMMITTED 모드 트랜잭션 T2 SELECT * FROM trantest WHERE empID = 'A002'; UPDATE trantest SET empName = '임꺽정' WHERE empID = 'A002'; COMMIT; --앞의 결과와 다름
23
트랜잭션 고립 수준 실습 Non-Repeatable Read(비반복 읽기) 문제 방지 실험 트랜잭션 T1
READ COMMITTED 모드 트랜잭션 T2 SELECT * FROM trantest WHERE empID = 'A002' FOR UPDATE; --트랜잭션 Lock을 걸어 데이터가 잘못 갱신되는 문제를 방지 UPDATE trantest SET empName = '강만중' WHERE empID = 'A002'; --Wait, T1이 COMMIT하면 실행됨 SELECT * FROM trantest WHERE empID = 'A002'; --결과는 위와 같음(T2 Commit이 아직 안됐으므로) COMMIT;
24
유령레코드 문제 곰돌이 시간 힌둥이 Select 사용기록 from 통장 Where 이름 = 커플통장 T1 T2
Insert into 통장 values(‘사용’,5만); T3 T4 뭐지… 그 사이에 왜 2개의 기록이 추가된 거지 나는 쓴 적 없는데.. T5
25
트랜잭션 고립 수준 실습 PHANTOM(유령) 레코드 문제 발생 실험 트랜잭션 T1 READ COMMITTED 모드
SELECT * FROM trantest FOR UPDATE; INSERT INTO trantest VALUES('A007', '박찬호'); COMMIT; -- A007이 유령 레코드가 됨 -- 따라서 두 셀렉트 문의 결과가 달라짐
Similar presentations