kjh00n의 기록저장소

데이터베이스 트랜잭션 본문

DB

데이터베이스 트랜잭션

kjh00n 2024. 11. 22. 12:50

데이터베이스 트랜잭션

● 최종적인 목적을 이루기 위한 작업의 단위, 모음

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

 

EX) abcd 글자가 저장된 test.txt 파일을 생성하고 싶다.

 

컴퓨터 부팅 → 문서편집기(메모장) 실행 → abcd라고 글자 작성 → 제목 지정 저장

특정 작업을 수행하는 과정을 트랜잭션이라고 한다. ↑

 

※ 트랜잭션 작업은 쉽게 최종적으로 완료를 하면 안된다. 작업하기 전으로 돌아가기가 불가능하다.

중간에 하나의 작업이라도 실패한다면? (트랜잭션의 중요한 규칙↓) (ACID)

① 규칙 (원자성 Atomicity)

● 트랜잭션은 중간에 작업이 하나라도 실패하는 경우가 있다면 그대로 진행하면 목적을 이룰 수 없다.

  • 모두 실패라고 처리돼서 처음부터 다시 진행해야 된다.

● 모든 작업이 성공적으로 완료되지 않으면 모두 실패로 취소해야 된다.● 작업을 하지 않은 상태로 되돌아가야 한다.

 규칙 (일관성 Consistency)

● 트랜잭션 작업을 진행하여 데이터를 수정,변경,생성,삭제 등 여러 작업을 진행하는데 기존 규칙을 무시할 수 없다.

③ 규칙 (독립성,격리성,고립성 Isolation)

● 트랜잭션 작업을 진행 중에 접근한 데이터에 대해 다른 사용자나 다른 작업이 끼어들 수 없다.

④ 규칙 (영구성 Durability)

● 트랜잭션 작업이 성공적으로 완료됐다.

  • 완료된 트랜잭션 작업은 절대 취소할 수 없다.

자동으로 commit 입력을 중지

 

트랜잭션 실행시키기 ↓↓↓

start transaction;

[SQL문];

[SQL문];

commit;

 

[임시설정]

위처럼 입력하면 SQL문들이 적용된다. 하지만 commit;이라고 입력했기에 다시 commit이 자동으로 시작된다.


해보기 (임시설정)

naver_db의 조회 결과

트랜잭션을 실행(commit을 자동 off)하고 데이터를 추가하면 추가한 입장에서는 데이터가 들어간 것으로 보인다.

하지만 터미널을 새로 열어서 naver_db로 들어가서 조회하면 입력한 데이터는 출력되지 않는다.

트랜잭션을 commit(적용)시킴

밑에 입력한 데이터가 새로운 터미널에서도 보인다.


(임시설정)

트랜잭션 실행하고 trtest2 추가

조회

새로운 터미널 열어서 조회해보면 commit을 안했기에 결과가 적용되어있지 않음

다시 트랜잭션 실행시킨 터미널로 와서 trtest3을 추가

새로운 터미널에서는 원자성때문에 적용된 데이터가 보이지 않음

트랜잭션이 완료,실패될 때까지 기다린다.(영원히는 X)

새로운 터미널에서 trtest4로 데이터를 수정해보려했지만 독립성에 의해서 처리가 되지 않는다.

타임아웃되었고 트랜잭션을 다시시작하고 있다.(독립성 때문에)

결국 실패한 모습

rollback이라고 치면 트랜잭션중에 했던 작업들이 다 취소되고 처음으로 돌아갔다.

트랜잭션을 킨 터미널에서 rollback을 입력하면 내가 데이터들을 입력하기 전으로 돌아간다.


모든 작업을 완료 후 트랜잭션을 완료하는 명령어

→ commit;

 

모든 작업을 취소하고 트랜잭션하기 전으로 돌아가는 명령어

→ rollback;

 

트랜잭션 중 원하는 시점을 저장

→ savepoint [이름];

 

원하는 시점으로 돌아가기

→ rollback to [저장한 세이브포인트 이름];

 

commit이나 rollback을 치면 트랜잭션은 자동으로 꺼진다.


트랜잭션 도중에 중간 지점으로 돌아가고 싶다면 그 지점에 SAVE를 해줘야된다.

세이브포인트 지정

트랜잭션 실행

데이터 추가해줬음

실제로는 데이터 추가된게 아님, 트랜잭션 기능 킨 터미널에서만 보이는거임

savepoint [savepoint명];

세이브된 시점은 trtest 2,3이 만들어진 시점이 세이브됐다.

세이브한 다음에 trtest4,5만들었음

세이브포인트로 이동하고 다시 조회해본 상태

세이브포인트인 sp1로 돌아와서 trtest4,5가 존재하지 않음

그 뒤에 다시 trtest4를 만들고 세이브포인트 sp2를 지정

그 뒤에 trtest5를 만들고 세이브포인트를 sp1로 이동한 모습

세이브포인트 sp1로 이동하면 세이브포인트 sp2를 저장하기 이전인 sp1로 이동했기 때문에 세이브포인트 sp2는 존재하지 않는다.


자동으로 commit입력을 중지 (영구설정하기)

→ set autocommit=0; (비활성화)

트랜잭션이 활성화되서 다른 터미널에서는 내가 commit하기 전까지는 다른 데이터들이 추가되서 보이지 않는다.

 

설정 확인

→ SELECT @@autocommit;


트랜잭션이 모든 SQL에 적용되는 것은 아니다

트랜잭션은 DDL(Create,Alter,Drop,Truncate,rename)에 적용안된다.

입력하면 바로 commit이 적용된다.

'DB' 카테고리의 다른 글

변수, 저장 프로시저, 제어문, 저장 함수  (0) 2024.11.25
실습7  (0) 2024.11.22
VIEW  (0) 2024.11.22
실습6  (0) 2024.11.22
서브쿼리  (0) 2024.11.21