본문 바로가기

Database/Oracle

데이터 조작어 [DML] 와 트랜잭션

DML은 다음과 같은 경우 사용된다.

- 새 행을 추가 할 경우

- 기존 행을 수정 할 경우

- 기존 행을 삭제 할 경우

트랜잭션은 논리 작업단위를 형성하는 DML 문의 모음으로 구성 됨.

 

트랜잭션과 관련있는 언어는 [Insert, Delete, Upeate] 이며

Select문은 데이터 베이스 구조에 변경을 일으키는 작업이 아니기 때문에

트랜잭션과 관련이 없음.

 

 

○ DML은 문장 전체가 하나의 트랜잭션이다.

ex :  insert -> insert -> insert    [이것을 하나의 트랜잭션으로 보고 한꺼번에 저장] = Commit

 

○ DCL, DDL 은 문장 하나가 하나의 트랜잭션이다.

ex: revoke -> commit,   create schma -> commit,  

 

 

 

【 Insert 】

 

한 번에 행 전체를 저장,  행 단위 작업을 함. / 데이터 베이스는 주소가 아닌, 데이터 라벨을 보고 접근하기 때문에 순서가 중요치 않음.

 

실제 업무에서 가장 많은 에러가 발생, [삽입 이상 혹은 검증에 막힘]

 

 

insert into [테이블 명] [컬럼]

values [삽입할 값]

 

○ into 절에 명시된 컬럼의 순서와 개수, values절 데이터의 순서/개수가 1:1로 매칭되어야 한다.

ex: into dept(주민번호, 이름, 업무) 이면,  values ('910303', '강동원', '디자인');

 

○ 또한 데이터의 타입도 매칭되어야 한다.

 

컬럼 무결성 : 타입이 맞아야함 ( 어떤 데이터의 몇글자까지 받아들일치 Varchar(5)에 '나는배고프다' 넣으면 에러

제약조건 무결성 : 예를 들어, PK 는 중복이 허용되지 않는다. [주민등록번호 중복이 가능한가?] 제약조건에 맞는 데이터들만 삽입 가능함

 

 

 

 

동일한 PK를 가진 데이터를 삽입한 경우 발생하는 무결성 오류

 

 

데이터 타입이 옳지 않을경우 발생하는 오류

 

 

 

 

Rollback 명령어는 트랜잭션을 취소한다, 즉 우리는 insert 등으로 데이터를 삽입했다고 해서

실제 데이터가 들어가는게 아닌, 트랜잭션을 Commit 시켜야 실제 데이터베이스에 반영됨을 알 수 있다.

 

 

 

 

 

『NULL을 넣는 방법』

 

 

into 절에서 삽일할 컬럼만을 명시할 경우, 나머지 컬럼에는 자동으로 NULL 값이 들어간다.

 

 

values 절에 null을 넣을 컬럼에 명시하여 주면, null을 삽입하게 된다.

 

 

 

 

 

 

가상 테이블의 sysdate를 컬럼의 값에 넣을 수 있다, sysdate는 시스템의 시간을 출력하는 변수이며

values 에 넣게 되면, 해당 칼럼에 추가된  년 월 일을 표기한다.

 

insert문장에는 치환변수를 사용할 수 있다.

 

 

【 update 】

 

행단위 작업을 하는 insert, delete와 다르게 열[컬럼]단위 작업을 한다.

 

update [테이블 명]

set  [컬럼 명]

[where] [조건]

 

where절은 선택 사항이다.

 

업데이트 문을 통해 employee_id가 206인 사원의 월급을 20000으로 수정하시오

 

 

 

 

where절의 조건을 명시하지 않으면, 조건없이 해당 테이블의 모든 해당 컬럼에 대해

데이터를 변경하게 된다.

 

【 delete 】

 

delete

from [테이블 명]

where [조건]

 

 

 

 

 

 

 

 

 

『읽기 일관성』

트랜잭션이 완료되지 않으면 (좌), 실제 데이터베이스에 반영되지 않는다 (우)


모든 트랜잭션은 T_1 , T_2 와 같이 할당되는데, T_2 트랜잭션은 T_1 트랜잭션의 상태에서 트랜잭션을 수행하게 되면 일관성이 깨지므로 이런 현상이 일어난다.

 

A,B,C 의 X가 5일 때

T1에서 A의 X를 3으로 교정

T2에서 X가 5인 값을 찾아라 하였을 때, 4개의 값이 색인되어버림

 

 

 

 

실제 데이터 베이스에서 트랜잭션이 진행되는 동안, 다른 트랜잭션을 실행시키려 하면

콘솔 행에 락이 걸리게 된다. [트랜잭션의 연산에 끼어들 수 없음]

 

 

따라서 트랜잭션의 시동은

락 -> 언락 -> 트랜잭션 실행 으로 이루어지며, 락이 할당되지 않으면, 트랜잭션 실행 자체가 되지 않는다

이는 락을 건 후, 트랜잭션의 실행 유무를 판단한 후 언락하고 트랜잭션 실행으로 이어지는 결과를 말한다.

 

이러한 락 메커니즘을 트랜잭션의 '병행제어' 라고 한다.

 

 다음과 같이 서로가 서로의 트랜잭션에 접근하려고 하는경우

교착상태가 발생한다.

 

따라서, 원하는 트랜잭션의 연산이 끝나면 반드시 Commit으로 트랜잭션 완료를 시켜야 한다.

 

트랜잭션의 크기가 크면, 락의 수가 작다 = 동시성이 떨어진다. -> Rollback으로 인해 손실되는 데이터가 많다.

트랜잭션의 크기가 작으면, 락의 수가 많다 =  동시성이 커진다. -> Rollback 으로 인해 손실되는 데이터가 적다.

 

단순히 말하면, 몰아서 저장하냐, 자주자주 백업하냐의 차이이다.

'Database > Oracle' 카테고리의 다른 글

제약 조건 설정  (0) 2021.01.06
데이터 정의어 [DDL] 의 활용  (0) 2021.01.05
Select 문 -3 (join)  (0) 2020.12.31
Select문 -2  (0) 2020.12.30
SQL 운용 상식  (0) 2020.12.29