[데이터베이스] 트랜잭션

조수훈·2023년 10월 12일
0

DataBase

목록 보기
11/11
post-thumbnail

DB 세션

DB 세션이란 데이터베이스의 접속을 시작으로, 여러 작업을 수행한 후 접속 종료까지의 전체 기간을 의미 합니다. 세션 내부에는 하나 이상의 트래잭션이 존재하게 됩니다.

트랜잭션

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.

간단하게 말해서 질의어(SQL)들을 이용하여 데이터베이스를 접근 하는 작업의 단위를 의미합니다.

트랜잭션의 특징(ACID)

A(Atomicity) : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 합니다.
만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것입니다.

C(Consistency) : 트랜잭션이 테이블에 변경 사항을 적용할 때 미리 정의된, 예측할 수 있는 방식만 취합니다. 트랜잭션 일관성이 확보되면 데이터 손상이나 오류 때문에 테이블 무결성에 의도치 않은 결과가 생기지 않습니다.

I(Isolation) : 여러 사용자가 같은 테이블에서 모두 동시에 읽고 쓰기 작업을 할 때, 각각의 트랜잭션을 격리하면 동시 트랜잭션이 서로 방해하거나 영향을 미치지 않습니다. 각각의 요청이 실제로는 모두 동시에 발생하더라도, 마치 하나씩 발생하는 것처럼 발생할 수 있습니다.

D(Durability) : 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 합니다.

Commit, Rollback 연산

Commit : 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산입니다

Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산입니다. Rollback시에는 해당 트랜잭션을 재시작하거나 폐기합니다.

Auto Commit 연산

AUTOCOMMIT이란 사용자가 Commit 명령을 따로 하지 않아도 자동으로 모든 명령을 Commit하게되어 즉시 반영되는 명령어 입니다. Rollback 을 할수 없으므로 주의해야 합니다.

show variables like 'autocommit%' : autocommit 설정 확인
SET autocommit = true; : autocommit 활성화
SET autocommit = false; : autocommit 비활성화

트랜잭션 격리 수준

트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것입니다. 격리수준은 크게 아래의 4개로 나뉩니다.

READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
아래로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적입니다.
일반적인 온라인 서비스에서는 READ COMMITTED나 REPEATABLE READ 중 하나를 사용합니다.
(oracle = READ COMMITTED, mysql = REPEATABLE READ)

READ UNCOMMITTED
각 트랜잭션에서의 변경 내용이 commit 이나 rollback 여부에 상관 없이 다른 트랜잭션에서 값을 읽을수 있습니다. 이는 DIRTY READ 가 발생할수 있으며, 정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장합니다.
DIRTY READ : 트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게되어서, rollback 해야하는 값이 다른 트랜잭션에서 보일수 있습니다.

READ COMMITTED
트랜잭션에서 COMMIT 이 된 데이터만 읽어드립니다. RDBMS 에서 대부분 기본적으로 사용되고있는 격리 수준으로, DIRTY READ 와 같은 현상은 발생하지 않지만 NON-REPEATABLE READ 가 발생 할수있습니다.
NON-REPEATABLE READ : 한 트랜잭션 내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장 하지 않는것

REPEATABLE READ
자신의 트랜잭션이 생성되기 이전의 트랜잭션에서의 COMMIT 이 된 데이터만 읽어드립니다.
MySQL 과 MariaDb가 기본으로 사용하는 격리 수준입니다.
MySQL 에서는 트랜잭션마다 트랜잭션 ID 를 부여하여 현재 트랜잭션ID 보다 작은 트랜잭션에서 변경한 것만 읽게 됩니다.

SERIALIZABLE
여러 트랜잭션이 동시에 실행되지 않으며, 한 번에 하나의 트랜잭션만 실행됩니다.
일련의 트랜잭션은 직렬적으로 실행되며, 한 트랜잭션이 끝나면 다음 트랜잭션이 실행됩니다.
이것은 일관성을 강조하는 데 사용되며, 트랜잭션 간의 충돌을 완전히 제거합니다. 그러나 동시성을 크게 제한할 수 있으며, 성능 저하를 초래할 수 있습니다.

동시성 제어

동시성 제어란, 둘 이상의 트랜잭션이 동시에 수행될 때, 데이터의 일관성을 해치지 않도록 하는 데이터 제어법을 말합니다. 다중 사용자 환경을 지원하는 DBMS 의 경우에는, 반드시 지원해야 하는 기능입니다.

갱신 손실(Lost Update)
하나의 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효화가 되는 것을 의미합니다.

락(Lock)
트랜잭션들이 동일한 데이터 항목에 대해 임의적인 병행 접근을 하지 못하도록 제어합니다.
한 트랜잭션이 데이터 항목에 대해 Read 나 Write 연산을 수행하려면 반드시 lock 을 걸어주어야합니다. lock 이 걸린 데이터는 다른 트랜잭션에서 Read 나 Write 연산을 할수 없습니다.

데드락(DeadLock)
두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 확득하고, 서로 상대방 데이터에 대하여 락을 요청하면 무한 대기 상태에 빠질수 있는 현상을 의미합니다.
데드락은 교착상태라고도 합니다.

DB 회복

회복(Recovery)

데이터베이스를 장애가 발생했던 이전의 상태로 복구시켜서 일관된 데이터베이스 상태를 만드는 것입니다. Dump 를 이용하는 방법과 log를 이용하는 방법이 있습니다.
Dump 는 가장 기본적인 기법으로 일정 주기로 원본의 데이터베이스의 모든 내용을 다른 저장장치에 복사하는 것입니다.
log는 변경 이전의 데이터베이스를 기준으로 변경 연산이 발생할 때 마다 로그 파일을 작성하여 기록하고, 회복할 때 로그에 적힌 내용을 사용하여 복원하는 방법입니다.

REDO, UNDO
REDO 는 장애가 발생한 후 시스템을 재가동 했을때, 로그 파일에 트랜잭션의 시작이 있고 commit 이 있는 경우에 로그를 보면서 트랜잭션이 변경한 내용을 다시 수행하는 과정입니다.
UNDO 는 장애가 발생한 후 시스템을 재가동 했을때, 로그 파일에 시작만 있고 commit 이 없는 경우 완료하지 못했지만 버퍼의 변경 내용이 데이터베이스에 기록되어 있을 가능성이 있기 때문에 로그를 보면서 트랜잭션이 변경한 내용을 원상복구시키는 과정입니다.

체크포인트 회복 기법
로그는 그대로 기록을 유지하면서, 회복 관리자가 정한 일정한 시간 간격으로 검사 시점을 생성하는 것을 의미합니다.
회복 시 많은 양의 로그를 검색하고 갱신하는 시간을 줄이기 위해서 만들어 졌습니다.
체크포인트 이전에 commit 기록이 있는 경우 : 아무 작업을 하지 않음
체크포인트 이전에 commit 기록이 있는 경우 : REDO
체크포인트 이전에 commit 기록이 없는 경우 : UNDO

REFERENCE

https://mangkyu.tistory.com/30
https://velog.io/@yujiniii/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80
https://coding-factory.tistory.com/226

profile
잊지 않기 위해 기록하기

0개의 댓글