본문 바로가기
데이터베이스/oracle

CHAPTER 11. 트랜잭션 제어와 세션-DO IT! 오라클로 배우는 데이터베이스 입문

by nyeongha 2024. 7. 4.

CHAPTER 11. 트랜잭션 제어와 세션

11-1 하나의 단위로 데이터를 처리하는 트랜잭션

트랜잭션이란?

더 이상 분할할 수 없는 최소 수행 단위를 뜻하며 계좌 이체와 같이 하나의 작업 또는 밀접하게 연관된 작업을 수행하기 위해 한개 이상의 데이터 조작 명령어(DML)로 이루어짐

어떤 기능 한가지를 수행하는 ‘SQL문 덩어리’라고 볼 수 있음.

트랜잭션은 하나의 트랜잭션 내에 있는 여러 명령어를 한번에 수행하여 작업을 완료하거나 아예 모두 수행하지 않는 상태, 즉 모든 작업을 취소함

트랜잭션의 의미를 ALL OR NOTHING문장으로 설명하기도함

트랜잭션을 제어하기 위해 사용하는 명령어를 TCL이라고 함

트랜잭션은 데이터베이스 계정을 통해 접속하는 동시에 시작

트랜잭션이 종료되기 전까지 여러 SQL문을 실행하고 트랜잭션을 제어하는 명령(TCL)을 실행할 때 기존 트랜잭션이 끝남.

11-2. 트랜잭션을 제어하는 명령어

하나의 트랜잭션에 묶여있는 데이터 조작어(DML)의 수행 사태는 모든 명령어가 정상적으로 수행 완료된 상태또는 모든 명령어가 수행되지 않아 취소가 된 상태, 이 두가지 상태로만 존재

트랜잭션 제어 명령어는 데이터 조작 상태를 이 두가지 상태 중 하나로 유도하는 명령어를 의미

즉 데이터 조작을 데이터베이스에 영구히 반영하거나 작업 전체를 취소

트랜잭션을 취소하고싶을떄는 ROLLBACK

ROLLBACK은 현재 트랜잭션에 포함된 데이터 조작 관련 명령어의 수행을 모두 취소

앞에서 실행한 데이터 조작 관련 명령어 실행이 모두 취소됨.

트랜잭션을 영원히 반영하고 싶을 때는 COMMIT

지금까지 수행한 트랜잭션 명령어를 데이터 베이스에 영구히 반영할 때는 COMMIT명령어를 사용

COMMIT명령어는 지금까지 트랜잭션에서 데이터 조작 관련 명령어를 통해 변경된 데이터를 모두 데이터베이스에 영구히 반영

COMMIT은 트랜잭션 작업이 정상적으로 수행되었다고 확신할 때 사용해야 함.

DDL사용시 트랜잭션이 종료됨.

ROLLBACK을 하면 이전 트랜잭션 종료 시점까지 INSERT,UPDATE,DELETE문의 실행이 취소됨.

COMMIT을 하면 트랜잭션이 종료됨


data type

데이터 타입 설명

char(size): 고정 길이 문자(최대 2000byte

varchar2(size): 가변 길이 문자(최대 4000byte)

clob: 가변 길이 문자( 최대 (4gb-1_*db_block_size)

number(p,s): 숫자(자릿수, 소수점 자릿수)

date: 날짜 및 시간(yyyy/mm/dd hh:mi:ss)

11-3. 세션과 읽기 일관성의 의미

세션이란?

세션은 어떤 활동을 위한 시간이나 기간을 뜻

오라클 데이터베이스에서 세션은 데이터 베이스 접속을 시작으로 여러 데이터 베이스에서 관련 작업을 수행한 후 접속을 종료하기까지 전체 시간을 의미

세션이 여러 개라는 말은 현재 오라클 데이터 베이스에 접속하여 사용 중인 연결이 여러 개 있다는 뜻

 

트랜잭션은 데이터 조작 명령어가 모인 하나의 작업 단위를 뜻하며 세션 내부에는 하나 이상의 트랜잭션이 존재함.

하나의 세션안에는 여러개의 트랜잭션이 존재→세션이 트랜잭션보다 큰 범위의 개념

읽기 일관성의 중요성

데이터베이스는 여러 곳(여러 사용자,여러 응용 프로그램)에서 동시에 접근하여 데이터를 관리 사용하는 것이 목적이므로 대부분 많은 세션이 동시에 연결되어 있음.

읽기 일관성이란 어떤 특저 세션에서 테이블의 데이터를 변경 중일 떄 그 외 다른 세션을 제외한 나머지 세션에서는 현재 진행 중인 변경과 무관한 본래의 데이터를 보여 주는 특성을 의미

읽기 일관성

어떤 데이터 조작이 포함된 트랜잭션이 완료( commit,rollback)되기 전까지 데이터를 직접 조작하는 세션 외 다른 세션에서는 데이터 조작 전 상태의 내용이 일관 적으로 조회,출력,검색되는 특성을 ‘읽기 일관성(read consistency)’라고 함

하나의 데이터베이스에는 수많은 세션이 연결되고 각 세션에서는 데이터 조작 명령어가 포함된 여러 트랜잭션이 끊임없이 시작되고 종료되면서 실시간으로 작업이 수행됨.

데이터를 직접 변경중인 해당 세션을 제외한 모든 세션은 다른 세션의 데이터 변경과 상관없이 이미 확정된 데이터만 검색됨으로써 읽기 일관성을 보장할 수있음.

11-4 수정 중인 데이터 접근을 막는 LOCK

LOCK이란?

특정 세션에서 조작중인 데이터는 트랜잭션이 완료(COMMIT,ROLLBACK)되기 전까지 조작할 수 없는 상태가 됨.

‘잠금’,’잠금 현상’으로도 표현하는 LOCK은 조작 중인 데이터를 다른 세션은 조작할 수 없도록 접근을 보류시키는 것을 뜻 함.

LOCK개념 살펴보기

sqlplus(세션A)에서 update를 실행한 뒤 커밋하지 않은 상태에서

sql developer(세션B)에서 아래 명령어를 통해 같은 행을 수정하면 LOCK이 걸림

update copy_employees
set salary=3000
where last_name='Grant';

sqlplus(세션A)에서 COMMIT으로 데이터 변경을 확정하여 반영하거나,

ROLLBACK으로 sqlplus(세션A)해주면 sql developer(세션B)의 update문 실행을 취소해야만 lock이 풀리고, 이와 동시에 sql developer(세션B)의 UPDATE문이 실행

 

HANG

HANG단어의 사전 의미 그대로 ‘매달려’있는 상태

잠긴 데이터가 풀려서 사용할 수 있을 때까지 기다리는 것

이렇게 특정 세션에서 데이터 조작이 완료될 때 까지 다른 세션에서 해당 데이터 조작을 기다리는 현상을 HANG(행)이라고 함

LOCK의 종류

LOCK은 하나의 데이터를 여러 곳에서 동시에 조작하려 할 때 발생할 수 있는 혼란을 최소화 하기 위한 중요한 요소

SQL문으로 조작하는 대상 데이터가 테이블의 특정 행 데이터일 경우에 해당 행만 LOCK이 발생한다는 의미로 ‘행 레벨 록(ROW LEVEL LOCK)’이라고 정의

WHERE절을 지정하지않은 UPDATE,DELETE문일 경우에는 테이블의 모든 행 데이터에 영향을 주는 명령어 이므로 테이블에 저장되어 있는 전체 행이 LOCK상태가 됨

테이블 전체 행이 LOCK상태여도 INSERT문의 수행은 가능

테이블에 변경되는 행의 수와는 상관없이 데이터 조작 명령어를 사용하여 데이터가 변경 중인 테이블 단위 잠금이라는 의미로 ‘테이블 레벨 록(TABLE LEVEL LOCK)’이 걸림