트랜잭션

momomoki·2023년 11월 22일
0

트랜잭션이란??

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻하며, 데이터베이스의 상태 변화란 데이터베이스의 추가하고 조회를 할 경우 누구는 추가한 정보를 보고 있고 누구는 추가 전 정보를 보고 누구는 추가 중인 단계의 정보를 볼 수 있다. 이럴 경우 중요한 정보는 모두가 똑같은 정보를 봐야 하지만 조건이 없다면 모두가 다른 정보를 볼 수 있게 되어 트랜잭션을 사용할줄 알아야합니다.

트랜잭션의 특징

트랜잭션은 크게 ACID로 나누어진다.
Atomicity(원자성) -> 트랙잭션이 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 한다.
Cosistency(일관성) -> 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
Isolation(독립성) -> 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션에 영향을 주어서는 안된다.
Durability(지속성) -> 트랜잭션이 성공적으로 완료 되었을 경우 결과는 영구적으로 반영되어야한다.

트랜잭션의 Commit, Rollback연산

commit은 하나의 트랜잭션이 성공적으로 끝났으며 데이터베이스가 일관성있는 상태에 있을때, 하나의 트랜잭션이 끝났다는 것을 알려주기 위해 사용하는 연산입니다.
rollback은 하나의 트랜잭션이 실패하여 원자성이 깨지는 경우를 말하며 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산 결과를 다시 취소 시킬 수 있다.

트랜잭션의 격리수준

트랜잭션의 격리수준은 ACID중 Isolation에 따라, 트랙잭션간의 독립성을 보장해야 하며 만얀 모두 완전히 독립성을 보장하기 위해서는 모든 트랜잭션을 차례로 처리해야하고, 이는 성능 하락으로 이어진다.
그래서 알맞은 격리수준을 사용하는것이 중요하다.

READ UNCOMMITTED (커밋되지 않은 읽기)

각 트랜잭션에서의 변경 내용이 commit, rollback 여부와 상관없이 다른 트랜잭션에서 값을 읽을 수 있다.
그래서 DIRTY READ발생(DIRTY READ란 하나의 트랜잭션 update가 실행되는 중 다른 트랜잭션에서 그 정보를 불러오면 commit을 안했는데 update가 적용된 정보를 가져온다.)

READ COMMITTED(커밋된 읽기)

트랜잭션에서 성공하고 commit된 내용들만 읽어온다. 대부분 RDB에서 기본값으로 사용한다. dirty read와 같은 현상은 발생하지 않지만 NON-REPEATABLE READ이 발생

NON-REPEATABLE
1번 트랜잭션에서 update 된 내용이 타 트랜잭션에서 바로 보여지지 않는다. 근데 1번 트랜잭션에서 커밋이 완료 되어도 2번 트랜잭션이 아직 완료 되지 않은경우, 2번 트랜잭션에서 다시 한번 조회를 하게 된다면 update 된 상태가 조회가 된다. 같은 조회문인데 결과가 다르기 떄문에 정합성에 어긋난다.

실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

Undo영역 데이터를 저장하는 버퍼 기능을 하는 것이며 트랜잭션에서 연산(commit,rollback)이 이루어지지 않아도 질의문에 의해 수정이 생기면 수정되기 이전 값이 저장되는 영역

REPEATABLE READ(반복 가능한 읽기)

자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 commit이 된 데이터만 읽는다. mysql과 mariaDB가 기본으로 사용하는 격리수준이며 mysql에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션의 번호에서 변경한것만 읽게 된다.

트랜잭션 번호에 대한 예
12번 트랜잭션과 10번의 트랜잭션이 있다면 10번이 시작하고 12번에서 일부 값을 업데이트 하고 커밋을 하면 10번 안에서 실행되는 모든 select 쿼리는 자신의 트랜잭션인 10번 보다 작은 트랜잭션 번호에서 변경한 것만 보게 된다. 즉 번호가 13인 트랜잭션에서 변견한 내용은 10번 트랜잭션에 영향을 주지 않는다. 이는 Undo 영역에 트랜잭션 번호가 저장 되어있었기 가능하다.

SERIALIZABLE(직렬화)

가장 단순한 격리 수준이지만 가장 엄격한 격리수준 데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회 SERIALIZABLE에서는 PHANTOM READ가 발생하지 않는다. 성능 문제로 데이터베이스에서는 거의 사용않한다.

PHANTOM READ -> 다른 트랜잭션에서 수행한 병경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상

profile
얍얍엽엽욥욥

0개의 댓글