[데이터 베이스] Transaction

연두비두밥·2024년 2월 8일
post-thumbnail

목차

Transaction, 트랜잭션이란?
왜 사용하는가?
트랜잭션의 특징
트랜잭션의 독립성
트랜잭션의 상태


Transaction, 트랜잭션이란?

데이터 베이스의 상태를 변경시키기 위해 수행하는 작업 단위라고 한다. Commit(커밋) 또는 RollBack(롤백)을 사용해 트랜잭션 단위로 작업을 확정하거나, 트랜잭션 내의 모든 DML 명령어를 취소할 수 있다.
즉, 작업 확정/최소의 단위가 되는 것이 트랜잭션이라고 한다.

간단하게 SELCET, INSERT, DELETE, UPDATE 의 질의어(SQL)를 이용하여 데이터 베이스에 접근하는 것을 의미

하지만 작업의 단위는 질의어 한문장이 아니다.

작업의 단위는 정하는 기준에 따라 달라진다.

명령어의미
COMMIT;트랜잭션 내의 작업 확정 (해당 트랜잭션 종료, 완결)
ROLLBACK;트랜잭션 내의 모든 명령어 취소 (해당 트랜잭션 내의 작업이 삭제)
마지막 커밋 직후의 상태로 복귀

왜 사용하는가?

A -----> B에게 2천원을 갚아야하는데,
A는 송금을 진행했지만 오류가 생겨 B는 받지 못 하였다. 이런 경우 생돈 2천원만 날아갔다.
이런 경우에 트랜잭션을 사용하면 롤백해서 다시 돌리고 새로 진행하게 된다.
이렇게 어떤 작업이 동시에 (사실은 순차적이지만 결과는 동시에 일어난다) 일어나야 할때, 사용한다.

다른 이유가 더 있으면 추가할 예정


트랜잭션의 특징 (ACID)

트랜잭션은 "ACID"라고 하는 원자성, 일관성, 격리성, 지속성을 보장해야한다.

특징설명
원자성(Atomicity)트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야한다.
일관성(Consistency)모든 트랜잭션은 일관성 있는 데이터 베이스 상태를 유지해야 한다. 예를들어 데이터 베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
독립성(Isolation)동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 독립적이여야한다. 즉, 서로 간섭이 불가능하여 동시에 같은 데이터를 수정하지 못 하도록 해야 한다.
지속성(Durability)트랜잭션을 성공적으로 끝내면 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다.

트랜잭션의 독립성

트랜잭션의 독립성은 '실행 중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없다.'이다.(격리성이라고 부르기도 함)
여기서 무조건 접근할 수 없다는 것이 아니라 접근 레벨이 있으며 DB에 따라 설정이 가능하다.
이런 독립성은 강하게 혹은 약하게 처리가 가능하다.

독립성 레벨

Read UnCommitted

  • 트랜잭션에서 처리중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용합니다.
    해당 레벨에서는 Dirty Read, Non-Repeatable Read, Phantom Read가 일어날 수 있습니다.

Read Committed

  • 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용합니다. 따라서 Dirty Read의 발생 가능성을 막습니다.
    커밋 되지 않은 데이터에 대해서는 실제 DB 데이터가 아닌 Undo 로그에 있는 이전 데이터를 가져오는 것입니다.
    해당 레벨에서는 Non-Repeatable, Phantom Read에 대해 발생 가능성이 있습니다.

Repeatable Read

  • 트랜잭션 내에서 삭제, 변경에 대해서 Undo 로그에 넣어두고 앞서 발생한 트랜잭션에 대해서는 실제 데이터가 아닌 Undo 로그에 있는 백업데이터를 읽게 합니다. 이렇게 함으로서 트랜잭션 중 값의 변경에 대해서 일정한 값으로 처리할 수 있습니다. 이렇게하면 삭제와 수정에 대해서 트랜잭션 내에서 불일치를 가져오던 Non-Repeatable Read를 해소할 수 있습니다.

Serializable Read

  • 트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지 안도록 하는 설정입니다.

독립성 문제점

Dirty Read

  • Dirty Read는 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다.

Non-Repeatable Read

  • Non-Repeatable Read는 한 트랜잭션 내에서 같은 Key를 가진 Row를 두 번 읽었는데, 그 사이에 값이 변경되거나 삭제되어 결과가 다르게 나타나는 현상을 말한다.

Phantom Read

  • 한 트랜잭션 내에서 같은 쿼리를 두 번 수정했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.

    Phantom Read와 Non-Repeatable Read의 차이는 Phantom Read는 여러개의 요청에 대해 데이터 값이 변경되고, Non-Repeatable은 1개의 Row씩 데이터 값이 변경된다.

    정리


    트랜잭션의 상태

트랜잭션은 논리적으로 5가지에 상태에 있을 수 있다고 한다.

상태설명
Active트랜잭션이 현재 실행 중인 상태
Failed트랜잭션이 실행되다 오류가 발생해서 중단된 상태
Aborted트랜잭션이 비정상 종료되어 Rollback이 수행된 상태
Partially Committed트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
Committed트랜잭션이 성공적으로 종료되어 Commit연산을 실행한 후의 상태

profile
꾸준하고 싶은 사람

0개의 댓글