데이터베이스 트랜잭션 알아보기.

 타이틀 입력부분 

데이터베이스의 연산들을 모아놓은 트랜잭션 알아보기.

 

데이터베이스는 파일시스템과 달리  [실시간 접근성] , [계속적인 변화], [동시 공유], [내용에 따른 참조] 의 4가지 특성이 존재하고, 데이터의 일관성과 지속성이라는 장점을 가지고 있습니다.

프로그램 개발을 진행하다보면 DB CRUD작업을 진행하며 데이터베이스를 다루는 일이 많아집니다. 하지만 본인의 직책이 DBA가 아닌 이상 데이터베이스에 대해 깊게 다루지 않기 때문에, 또한 아직 주니어인 저의 짧은 개발자의 인생에서 DB에서 어떻게 데이터의 일관성과 지속성을 관리하는지 잘 모르고 개발을 진행했었습니다.

때문에 데이터베이스가 어떻게 동작하고, 어떻게 데이터를 관리하는지 깊은 이해도가 생긴다면 이후, 데이터베이스를 활용한 개발 측면에서 마주칠 문제들에 대해서 좀 더 빠르고 신속하게 대처할 수 있지 않을까 생각되어 시간이 날 때마다 여러 포스팅들과 문서들을 참조하며 공부를 진행하고 있습니다. 이번 포스팅에서는 데이터베이스의 장점인 데이터를 정확하고 일관된 상태로 유지할 수 있도록 다양한 기능을 제공하는 것들 중 하나인 트랜잭션에 대하여 알아보겠습니다.

 

1.트랜잭션(Transaction)이란?

트랜잭션(Transaction)이란 쉽게 말하면 데이터베이스에서 하나의 작업을 수행하기 위해 필요한 데이터베이스 연산 기능들을 모아놓은 것이며, 분리되지 않도록 하여 작업의 완전성을 보장하고, 장애가 발생했을 때 데이터를 복구하는 논리적 작업 단위를 의미합니다.

 

데이터베이스는 정확한 데이터를 유지하고 오류 발생시 빠르게 복구하며, 정확하고 일관된 상태를 유지할 수 있게하기위한 많은 기능들을 제공하는데, 그 많은 기능중에서 가장 중요한 역할을 하는 것이 트랜잭션입니다. 트랜잭션을 관리함으로써 데이터베이스의 회복 및 병행제어를 가능케 합니다.

 

데이터베이스의 연산을 SQL문이라 칭한다면, 하나의 작업을 수행하는 SQL문의 집합이 트랜잭션이라고 생각할 수 있습니다.

 

 

2.트랜잭션의 특징

트랜잭션이 성공적으로 처리되기 위해서는 아래 4가지 성질들(ACID)을 만족해야 합니다.

 

첫 번째 원자성 (Automicity)

트랜잭션을 구성하는 연산은 반드시 모두 실행이 되거나, 반대로 아예 실행되지 않아야 하는데(All or Noting) 즉, 하나의 트랜잭션에서 일부 연산만 실행되면 안됩니다. 때문에 실행 도중에 오류가 발생하여 작업을 완료하지 못했다면 트랜잭션 전체를 취소하여 수행 이전으로 rollback해야 합니다. 때문에 트랜잭션의 원자성을 보장하려면 장애가 발생했을 시 데이터베이스를 원래 상태로 복구시키는 회복기능이 필요합니다.

 

두 번째 일관성 (Consistency)

트랜잭션이 완료된 상태에서도 트랜잭션 이전 상황과 동일하게 데이터의 일관성이 있어야 하는 특성을 만족해야 합니다. 이 말을 편의점 정산을 예로 들어보면, 트랜잭션 수행 이전 (정산 전) 실제 재고와 포스기 재고가 달라지거나 혹은 포스기 잔액과 정산 매출의 금액이 달라지는 등 모순이 발생하면 안된다는 이야기입니다.

 

세 번째 독립성 (Isolation)

트랜잭션이 수행될 시, 다른 트랜잭션에 간섭을 주거나 간섭을 받지 않고 스스로 독립적으로 수행되어야 합니다. 둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행중인 트랜잭션이 완료되기 전에 생성한 중간 연산 결과를 다른 트랜잭션으로 접근시키거나 대입시키면 안된다는 의미입니다. 독립성을 통하여 사용자들은 여러 트랜잭션이 동시에 수행되고 있는 것처럼 느끼면서도 정확한 결과를 얻을 수 있게 되는 것 입니다.

 

네 번째 지속성 (Durabilty)

트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적으로 지속되어야 함을 의미합니다. 시스템에 장애가 발생하더라도 트랜잭션 작업 결과는 없어지지 않고 데이터베이스에 그대로 남아있어야 하며 트랜잭션의 지속성을 보장하려면 시스템에 장에가 발생했을 시 데이터베이스를 원래 상태로 복구하는 회복 기능(rollback)이 필요합니다.

 

 

3.트랜잭션 연산

트랜잭션이 무엇인지 알아보았다면 최소 2가지의 연산을 유추할 수 있습니다. 데이터를 지속적이고 영구적으로 관리할 수 있게 하는 처리 이후 완료작업과, 처리중 오류가 발생했을 시 처음 상태로 복구하는 회복 연산 2가지의 연산을 의미합니다. 트랜잭션 연산은 크게 Commit 연산과 Rollback 연산이 있고, Rollback 연산시 사용되는 저장점(SavePoint)등이 있습니다.

 

첫 번째 Commit 연산

트랜잭션이 성공적으로 수행되었음을 선언하는 연산입니다(작업완료를 의미). Commit 연산이 실행된 후에 트랜잭션의 수행 결과가 데이터베이스에 반영되어 데이터베이스가 일관된 상태를 지속적으로 유지하는 것이 가능해집니다. Commit연산의 실행을 통하여 트랜잭션 수행이 성공적으로 완료되었음을 트랜잭션 관리자에게 알려주고 결과를 최종 데이터베이스에 반영하는 연산입니다.

 

두 번째 RollBack 연산

트랜잭션이 수행되다가 오류를 표현하는 경우에 수행되는 연산으로 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 잃었거나 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션 수행 이전의 상태로 돌아가는 연산을 의미합니다. Rollback 연산을 하게되는 경우에는 해당 트랜잭션을 재시작하거나 폐기처리합니다. 

 

번외 SavePoint

저장점(SavePoint)를 정의하자면 롤백시 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아닌, 현 시점에서 Savepoint까지 트랜잭션의 일부분만 롤백할 수 있게됩니다. 때문에 복잡하고 대규모 트랜잭션에서 에러가 발생했을 경우 savepoint까지 트랜잭션만 롤백하여 실패한 부분에 대해서만 다시 힐행할 수 있게 됩니다. 복수의 savepoint를 정의할 수 있으며 동일한 이름의 savepoint를 정의했을떄는 후에 정ㅇ의한 저장점이 유효합니다.

'DB' 카테고리의 다른 글

[MongoDB] MacOs에 MongoDB 설치하기  (0) 2022.06.20
데이터베이스 DDL DML DCL TCL 정리하기  (0) 2022.03.27
데이터베이스 정규화  (0) 2022.03.22