CS공부/데이터베이스

트랜잭션(Transaction) 1(트랜잭션이란+트랜잭션 작동방식)

kluiop1 2021. 7. 20. 17:00

트랜잭션이란?

데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위

데이터베이스의 상태를 변환시키는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

 

트랜잭션의 성질

원자성(Atomicity)

1-1. 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.

트랜잭션은 사람이 설계한 논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어 져야 사람이 다루는데 무리가 없다.

1-2. 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

 

일관성(Consistency)

2-1. 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것

2-2. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.

 

독립성(Isolation)

3-1. 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다.

3-2. 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

 

지속성.(Durablility)

4-1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

 

 

트랜젝션의 특징

1. 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.

2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.

3. 하나의 트랜잭션은 Commit되거나 Rollback된다.

 

트랜젝션의 연산

Commit연산

 

Commit 연산이란

하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 수행한 갱신 연산이 완료된 것을 관리자에게 알려주기 위해 사용하는 연산이다.

 

Rollback 연산

 

Rollback 연산이란

하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시켜서 원자성을 구현한다. 후에 사용자가 트랜잭션 처리된 단위대로 Rollback을 진행할 수도 있다.

 

그리고 부분적으로만 연산된 결과를 다시 취소시키는것에는 SavePoint가 사용된다.

 

SavaPoint?

트랜잭션에 포함된 전체작업을 롤백하는 것이 아니라 현시점에서 일정 지점까지 일부만 롤백하게 할 수 있게 해주는 기능이다. 따라서 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 Savepoint까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행 가능하다.(일부 툴에서는 지원이 안 될 수도)

 

트랜잭션의 상태

활동(Active) : 트랜잭션이 실행중인 상태

실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태

철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태

완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

 

트랜젝션의 동작 방식

 

1. 쿼리 실행

해당 쿼리가 쿼리 처리기를 통해 통과가 됨

해당 쿼리를 처리하기 위해서는 구매자의 데이터가 필요하기 때문에 데이터 캐시에 구매자의 데이터를 요청한다.

 

2. 캐시에 데이터가 없는 경우에 데이터파일에서 데이터를 가져옴

3. 데이터 파일에서 데이터 캐시로 데이터를 가져옴

 

데이터 파일에서 필요한 데이터를 데이터 캐쉬로 가져오고,

데이터 캐쉬는 필요한 데이터가 업데이트된다.

가져온 데이터를 업데이트 하기 전에 먼저해야할 일은, 로그를 기록하는 것

 

4. 로그 기록 진행

로그의 종류에는 REDOUNDO가 있음

REDO : 변경 후(업데이트 후)의 값을 기록

UNDO : 변경 전(업데이트 전)의 값을 기록

REDO의 경우 트랜잭션이 시작되었다 명시를하고, 그 데이터가 어떻게 변경될 것인지 기록

UNDO는 해당 데이터값이 원래 무엇이었는지 기록

 

5. 로그를 기록 후 데이터 캐시를 업데이트

6. Commit 발생

트랜잭션이 완료가 되면은 REDO로그에는 트랜잭션이 COMMIT되었다는 기록을 한다.

 

7. 만약 ROLLBACK이 발생했을 경우

UNDO로그로 데이터 복원

왜냐하면 지금까지 데이터 캐시에서 데이터를 업데이트해서 변경된 상태로 있을 것이고, UNDO로그로 다시 원래값으로 복원한다.

 

8. 만약 예상치 못한 오류가 발생하는 경우

REDO 로그를 이용해서 데이터를 다시 원래상태로 복원한다. (일관성있게 만들어준다.)

트랜잭션이 완료된 경우에는 REDO로그를 통해서 복원해야하고, 트랜잭션이 수행되는 도중에 발생하면 UNDO를 통해 복원하는 것

 

참고: https://mommoo.tistory.com/62

https://coding-factory.tistory.com/226

https://hoon93.tistory.com/24

https://velog.io/@syleemk/%EB%A9%B4%EC%A0%91-%EB%8C%80%EB%B9%84-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%A0%84%ED%8C%8C