-
DB - TransactionCS/DB 2021. 2. 14. 22:42
Transaction
트랜젝션이란
-
데이터베이스에서 하나의 논리적 기능을 수행하기 위한 일련의 연산 집합으로서 작업의 단위이다.
- 다음과 같은 4가지 원칙을 만족한다.
- 원자성(Automicity): 트랜젝션의 연산은 DB에 모두 반영되던가, 전혀 반영되지 않아야 한다.
- 일관성(Consistency): 트랜젝션 작업이 종료된 후에도 일관성 있는 DB상태를 유지해야 한다.
- 독립성(Isolation): 한 트랜젝션이 작업하는 동안 작업중인 데이터를 다른 트랜젝션들이 접근하지 못하도록 해야 한다.
- 영속성(Durability): 트랜젝션의 실행이 성공적으로 완료된 후 결과는 영구적으로 반영되어야 한다.
격리수준(Isolation level)
- 동시에 여러 트랜젝션이 처리될 때 일관성 없는 데이터를 허용하는 수준을 말한다.
- 격리수준은 크게 아래의 4가지로 나뉘며 아래로 내려갈수록 고립 정도가 높아지고 성능이 떨어진다.
- Read Uncommitted
- 트랜젝션의 변경 내용이 commit이나 rollback에 상관없이 다른 트랜젝션에서 보여진다.
- Dirty Read 현상이 발생할 수 있다.
- a트랜젝션에서 10번 사원의 나이를 27 -> 28로 변경 후 아직 커밋하지 않음
- b트랜젝션에서 10번 사원의 나이를 조회하면 28로 조회됨(Dirty Read)
- a트랜젝션이 rollback한다
- b트랜젝션은 10번사원이 여전히 28살이라고 생각하고 로직을 수행한다.
- Read Committed
- 트랜젝션의 변경 내용이 commit 되어야만 다른 트랜젝션에서 조회할 수 있다.
- Non-Repeatable Read 부정합 현상이 발생할 수 있다.
- b트랜젝션에서 10번 사원의 나이를 조회한다 -> 27
- a트랜젝션에서 10번 사원의 나이를 27 -> 28살로 변경하고 커밋한다.
- b트랜젝션이 다시 10번 사원의 나이를 조회한다 -> 28 (Non-Repeatable Read. 하나의 트랜젝션이 같은 값을 조회할 때 다른 값이 검색된다.)
- Repeatable Read
-
트랜젝션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있다. 즉 트랜젝션이 시작되고 종료되기 전까지 한 번 조회한 값은 계속 같은 값이 조회된다.
-
자신의 트랜젝션 보다 먼저 실행된 트랜젝션에서 변경된 것만 보게 된다.
-
Mysql DBMS에서 기본으로 사용하고 있다.
-
update한 데이터에 대해서는 정합성을 보장하지만, insert/delete는 보장되지 않는다.
-
Phantom Read문제가 발생한다.
-
a트랜젝션을 시작하고 10번 사원의 나이를 조회한다 -> 27
-
b트랜젝션을 시작하고 10번 사원의 나이를 27 -> 28로 변경하고 커밋한다.
-
a트랜젝션이 10번 사원의 나이를 조회한다 -> 27 (b트랜젝션이 자신보다 늦게 시작하였으므로 변경된 것을 읽지 않는다.)
-
b트랜젝션이 11번 사원의 정보를 삽입한다.
-
a트랜젝션이 사원의 정보를 조회한다 -> 10, 11번 데이터가 조회된다. (insert에 대해서는 정합성이 보장되지 않는다. Phantom Read - 있던 데이터가 사라지거나 없던 데이터가 생기는 현상이다.)
-
- Phantom Read문제가 발생한다.
- 바로 위 예제에서 마지막에 a트랜젝션이 11번 데이터까지 조회하고 있다.
-
- Serializable
- 가장 높은 격리수준으로 트랜젝션이 특정 테이블을 읽으면 다른 트랜젝션은 그 테이블의 데이터를 추가, 변경, 삭제할 수 없는 수준이다.
- 동시 처리 성능이 가장 떨어지나 위에서 언급되었던 정합성 문제가 전혀 발생하지 않는다.
- Read Uncommitted
Lock
- 트랜젝션 처리의 순차성을 보장하기 위한 방법이다.
- 종류로는 공유 lock와 베타 lock가 있다.
- 공유(Shared) Lock
- 데이터를 읽을 때 사용되는 Lock이며 공유 Lock끼리는 동시에 접근 가능하다.
- 즉 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다.
- 하지만 공유 Lock이 설정된 데이터에 베타 Lock를 사용할 수 없다.
- 베타(Exclusive) Lock
- 데이터를 변경할 때 사용되는 Lock이며 트랜젝션이 완료될 때까지 유지된다.
- 베타Lock이 해제될 때까지 다른 트랜젝션은(읽기 포함) 해당 리소스에 접근할 수 없다.
- 하나의 데이터 항목에 대해 하나의 배타 Lock만 가능하다.
- 공유(Shared) Lock
데드락(교착상태)
-
여러개의 트랜젝션 들이 실행을 하지 못하고 서로 무한정 기다리는 상태를 의미한다.
- 트랜젝션 처리의 순차성을 보장하기 위한 Locking은 교착상태를 일으킬 수 있다.
- 두 트랜젝션이 각각 Lock를 설정한 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 Lock처리가 되어 양쪽 트랜젝션 모두 영원히 처리가 되지 않는 상태를 말한다.
- 교착상태가 발생하면 DBMS가 둘 중 한 트랜젝션에 에러를 발생시킴으로써 문제를 해결한다.
- 교착상태의 빈도를 낮추는 방법
- 트랜젝션을 자주 커밋한다.
- 테이블 접근 순서를 동일하게 한다.
reference
velog.io/@hygoogi/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%AA%A8%EC%9D%8C
'CS > DB' 카테고리의 다른 글
[DB]Transaction (0) 2021.07.11 DB - RDBMS (0) 2021.03.01 DB - Index (0) 2021.02.14 DB - KEY (0) 2021.02.12 DB - 파티셔닝과 샤딩 (0) 2021.02.12 -