본문 바로가기

Computer Science/Database

[DB] Transaction (트랜잭션)

반응형

1. Transaction

트랜잭션은 데이터베이스의 상태를 변화시키는 논리적인 작업 단위를 의미한다. 데이터베이스의 상태를 변화시키는 작업이란 데이터베이스에 접근하여 데이터를 읽고, 쓰고, 수정하고, 삭제하는 등의 작업을 의미한다. 이런 작업들, 트랜잭션은 성공과 실패가 분명하고, 상호 독립적이다.

 

트랜잭션을 조작함으로 인해 사용자는 데이터베이스의 완전성 (Integrity)를 유지한다. 단일 트랜잭션은 데이터베이스에 읽거나 쓰는 등의 작업을 수행하는 여러 개의 쿼리를 요구한다. 이때 트랜잭션을 수행하면서 쿼리의 일부만 수행되는 일이 없어야 한다. 모든 작업이 완벽하게 처리되거나 또는 처리되지 못하는 경우 원상태로 복구되어야 한다.

2. 트랜잭션의 특징 (ACID)

데이터베이스의 트랜잭션이 안전하게 수행된다는 것을 보장하기 위해서는 다음의 성질들을 만족해야 한다.

원자성, Atomicity

트랜잭션은 DB 작업의 최소 단위가 되어야한다.

트랜잭션은 논리 작업 단위로써 정상적으로 트랜잭션 전체가 수행되거나 문제가 있는 경우 아예 수행되지 않아야 한다.
트랜잭션을 수행하던 중 문제가 생기면 이전에 수행한 작업이 모두 원복되어서 작업의 일부분만 수행되는 일이 없어야 한다.

일관성, Consistency

트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.

트랜잭션에서 사용하는 데이터가 작업 도중 다른 작업에 의해 변경되더라도 해당 트랜잭션의 수행에는 영향을 미치지 않아야한다.
트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 트랜잭션은 업데이트 된 데이터가 아닌  작업이 수행될 때의 데이터베이스를 가지고 변경을 진행함으로 데이터의 일관성을 보장해야한다.
만약 데이터의 일관성에 문제가 있으면 다시 원복되어야 한다.

고립성, Isolation

각각의 트랜잭션은 서로간에 간섭없이 독립적으로 수행되어야 한다.
트랜잭션이 완료될 때까지 다른 트랜잭션에서는 해당 변경의 결과를 참조할 수 없다.

지속성, Durability

트랜잭션이 정상적으로 완료된 후에는 영구적으로 데이터베이스에 작업 결과가 저장되어야 한다.

3. Commit, Rollback

트랜잭션을 수행 중에 작업이 실패하는 경우가 발생할 수 있다. 이러한 상황을 방지하기 위해서 데이터베이스에서는 commit과 rollback 연산을 수행하여 트랜잭션 결과를 저장 또는 원복한다.

Commit

트랜잭션의 모든 작업이 수행된 후에 작업의 결과, 데이터베이스의 상태 변화를 저장하기 작업 완료를 알려준다. 이 연산을 수행하면 수행했던 트랜잭션이 로그에 저장되고, 후에 Rollback 연산을 수행하는 경우 트랜잭션 단위로 원복을 할 수 있도록 해준다.

Rollback

만약 트랜잭션이 정상적으로 모든 작업을 수행하지 못한 경우에 트랜잭션 수행 전으로 데이터베이스를 원복한다. 트랜잭션의 처리 단위대로 원복할 수 있다.

4. 트랜잭션의 상태

1) Active

트랜잭션의 활동 상태. 트랜잭션이 실행 중이며 동작중인 상태를 말한다.

2) Failed

트랜잭션 실패 상태. 트랜잭션이 더이상 정상적으로 진행할 없는 상태를 말한다.

3) Partially Commited

트랜잭션의 commit 명령이 도착한 상태. 트랜잭션의 commit 이전 sql 문이 수행되고 commit 남은 상태를 말한다.

4) Aborted

트랜잭션의 취소 상태. 트랜잭션이 취소되고 rollback 연산을 수행하여 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

5) Commited

트랜잭션이 완료된 상태

※ Partially Commited Commited 차이점

Commit 요청이 들어오면 상태는 partially commited 상태가 된다. 이후 commit 문제없이 수행할 있으면 commited 상태로 전이되고 만약 오류가 발생하는 경우 failed 상태가 된다. partially commited commit 요청이 들어왔을 때를 말하며, commited commit 정상적으로 완료한 상태를 말한다.

5. Deadlock

복수의 트랜잭션을 사용하다 보면 교착상태가 일어날 있다. 교착상태란 이상의 트랜잭션이 특정한 자원의 lock 획득한 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다.

 

※ lock

lock 이란 트랜잭션의 처리 순차성을 보장하기 위한 방법이다.  lock은 여러 커넥션에서 동시에 동일한 자원을 요청하는 경우 순서대로 하나의 커넥션만 해당 자원에 접근할 수 있도록 해준다.  lock 은 해당 트랜잭션이 완료될 떄까지 유지된다.

 

이러한 데드락을 방지하기 위해서는 트랜잭션을 자주 커밋하거나 쿼리를 작성할 때 트랜잭션들이 테이블에 접근하는 순서를 동일하게 구성하는 등의 방법으로 데드락 빈도를 낮출 수 있다. 테이블의 순서를 동일하게 구성하게 되면 테이블 단위의 lock 을 획득해 작업을 수행하기 때문에 동시성은 떨어지지만 순차적으로 접근하여 교착상태를 피할 수 있다.

반응형

'Computer Science > Database' 카테고리의 다른 글

[DB] 트랜잭션 격리수준 (Transaction Isolation Level)  (0) 2022.07.29
[DB] SQL 기본 정리  (0) 2021.11.07