Linux/SQL

[DBMS] 트랜잭션 Transaction

GGkeeper 2021. 11. 30. 01:15

• 트랜잭션(Transaction)
한꺼번에 수행되어야 할 최소 작업 단위

논리적 작업 단위(LUW, Logical Units of Work)

모든 작업은 반드시 한꺼번에 완료가 되야 하며 그렇지 않은 경우에는 한꺼번에 취소되어야 함

사용자가 시스템에 요구를 시작하여 시스템 내의 처리, 시스템에서 사용자에게 응답하는 모든 처리를 포함


• 트랜잭션 기술적 요건(ACID)

원자성(Atomicity)

분리 할 수 없는 하나의 단위로 작업은 모두 완료되거나 모두 취소되어야 함

트랜잭션의 처리가 취소된 경우 전혀 이루어지지 않은 것과 같아야 함

작업 중 에러가 발생되면 rollback(되돌리기)

 

일관성(Consistency)

트랜잭션들간의 영향이 한 방향으로만 전달되어야 함

오류 없이 유효한 데이터만 저장되어야 함

 

고립성(Isolation)

트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 주어선 안됨

접근하고 있는 데이터는 다른 트랜잭션으로부터 격리 되어야 함

 

영구성(Durability)

트랜잭션이 완료된 경우 다른 시스템 고장이나 네트워크 장애 등으로 데이터가 유실되지 않고 정상적 으로 기록되어야 함

작업이 완료되면 commit(적용)


• 트랜잭션 범위

로컬 트랜잭션 (local transaction)

단위 시스템에서 처리되는 트랜잭션으로 트랜잭션에 대한 관리를 DBMS에서 담당

 

분산 트랜잭션

여러 개의 시스템에서 처리되는 트랜잭션

여러 DBMS에 걸친 트랜잭션을 담당하는 경우도 많아서 주로 미들웨어(middleware)에서 트랜잭션 관리를 담당


• 트랜잭셔널 데이터베이스

트랜잭션을 지원하는 데이터베이스

현재 대부분의 관계형 데이터베이스 관리시스템은 트랜잭션 데이터베이스 지원


• 트랜잭셔널 파일시스템

트랜잭션을 지원하는 파일시스템

리눅스의 Namesys Reiser4 파일시스템과 마이크로소프트 NTFS 새로운 버전은 모두 트랜잭션을 지원


• mysql 트랜잭션

MyISAM/MEMORY/MERGE 엔진은 트랜잭션 지원 안됨

InnoDB 엔진만 지원

mysql은 명령어 수행 시 자동으로 commit 하도록 되어 있음


• 트랜잭션 SQL

트랜잭션에 사용되는 SQL은 DCL에 포함되지만 따로 TCL(Transaction Control Language)로 분류하기도 함


• 트랜잭션 시작 알림

mysql은 기본 autocommit 기능이 활성화 되어 있기 때문에 SQL 입력 시 자동 commit 됨

임시로 autocommit 사용하지 않도록 설정

하나의 트랜잭션 작업이 끝나면(commit 이나 rollback) 설정 삭제 됨

트랜잭션 작업을 다시 하기 위해서는 새로운 시작을 알려줘야 함

mysql> start transaction;

= Transaction 이 시작하는 명령어이다.


• 트랜잭션 작업

테이블에 데이터 추가 후 확인(naver_db)

MySQL 새로운 접속 연결 후 데이터 확인

새로운 터미널에서 mysql 하나 더 접속하기

* 데이터 추가가 안됨

= Transaction 이 시작되었기 때문에 Commit 또는 Roll back 하지 않는 이상 다른 터미널에서는 볼 수 없다.


• 트랜잭션 작업 savepoint

savepoint 지정

mysql> savepoint <savepoint명>;

= 현재 Transaction 이 시작된 터미널에서 작업된 곳까지 savepoint 를 만든다.


• 트랜잭션 작업 rollback to savepoint

savepoint 지점으로 rollback

mysql> rollback to <savepoint명>;

= 데이터를 하나 추가 후 rollback 세이브 지점을 주게되면 해당 savepoint 지점으로 되돌린다.

 하지만 역시 다른 터미널에서는 아직까지 확인이 불가능하다.


• 트랜잭션 작업 - rollback

트랜잭션 시작지점으로 rollback

mysql> rollback;

= savepoint 지점 없이 rollback 을 할 경우, 트랜잭션 시작 이후 작업 모두 취소 된다.

역시나 다른 터미널에서는 확인이 불가능하다.


rollback 이나 commit 이 실행되면 트랜잭션 종료 됨

트랜잭션 작업 중이던 터미널에서 데이터 추가 및 확인

 

새로운 트랜잭션 작업을 하려면 트랜잭션 시작 알림을 다시 해 줘야 함 

mysql> start transaction;


• 트랜잭션 작업 - commit

트랜잭션 정상 완료

mysql> commit;

= commit 으로 트랜잭션 시작 후 작업이 종료되고, 모든 데이터가 저장된다.

이때는 다른 터미널에서 저장된 데이터를 확인할 수 있다.


• 트랜잭션 Lock

트랜잭션 작업 중인 데이터를 다른 트랜잭션이 사용하지 못하도록 격리 시킴

트랜잭션 시작 후 데이터 업데이트

다른 터미널에서 동일한 데이터 업데이트 요청

일정 시간 대기 하다가 Lock으로 인한 timeout 메시지 발생 → 업데이트 적용 안됨


• 트랜잭션 설정 시 주의사항

- 트랜젝션 범위를 최소화

각 단위 프로그램이 커넥션을 유지하는 시간이 길어질 수록 사용 가능한 여유 커넥션의 개수가 감소

각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황 발생 가능성


- 네트워크를 통한 작업은 트랜잭션에서 제외

메일 전송, FTP 파일전송 작업, 원격 서버와 통신 등

프로그램이 실행되는 동안 서버와 통신할 수 없는 상황이 발생한다면 DBMS 서버까지 위험해지는 상황 발생 가능성

 

- rollback 가능 여부 확인 (주의!!)

일부 SQL문은 rollback 되지 않음

DDL문을 사용할 때에는 자동으로 COMMIT이 적용

> CREATE, ALTER, DROP, RENAME, TRUNCATE

 

= 트랜잭션 작업 도중 DDL 명령문을 사용하면, 자동 commit 이 적용되 트랜잭션 명령문이 종료될 수 있기 때문에 주의한다.

'Linux > SQL' 카테고리의 다른 글

[DBMS] 변수(Variable)  (0) 2021.12.08
[DBMS] 트랜잭션 Transaction : Autocommit 기능 설정  (0) 2021.11.30
[DBMS] 뷰 View  (0) 2021.11.30
[DBMS] 유니온 Union  (0) 2021.11.30
[DBMS] JOIN 조인  (0) 2021.11.30