트랜잭션과 동시성 제어 그리고 Lock

운영체제를 공부하게 되어서 트랜잭션에 대하여 포스팅을 합니다.
아래 내용들은 제가 이해한 내용들을 바탕으로 작성한것 이므로 부족한점이나 틀린점이 있으면 지적 부탁드립니다.

트랜잭션의 목표

모든 데이터들이 Consistent하게 되게 하기 위함.

Recoverable 하다는 의미

특정 Object가 서버의 충돌이 나도 복구가 가능한 상태 이다.

트랜잭션의 4개의 특징 ACID

Atomicity: 트랜잭션이 전부 잘 되거나 전부 안되거나 둘중 하나가 보장이 되어야 한다. 이는 장애가 나서 부분만 되는 결과가 있어서는 안된다는 의미

Consistency
트랜잭션을 통하여 Consistent를 유지가 되어야 한다.

Isolation
트랜잭션이 다른 트랜잭션에 영향을 주지 않는다.

Durability
트랜잭션 성공 후 모든 결과는 영원히 보존이 된다.

트랜잭션을 잘 사용하려는 목적은 동시성을 최대화 하기 위함.

트랜잭션 손실 불일치

아래는 트랜잭션을 동시에 진행해버려서 U의 업데이트 트랜잭션이 손실된 상황이다.
이는 오래된 데이터를 사용하였기 때문이다.

아래는 트랜잭션 도중에 조회를 해서 데이터가 불일치한 상황이다.
업데이트 도중에 트랜잭션이 발생한 문제이다.

Serial equivalence 

위처럼 여러 트랜잭션이 발생하여도 불일치, 손실등이 발생하지 않는 현상태를 serially equivalent interleaving이라고도 한다. 

Conflicting operations

이러한 트랜잭션의 충돌이 발생하지 않으려면 동시에는 Read만 사용하여야 한다.

Serially equivalent 하게 ordering 하기 위해서는 아래 처럼 되어야 한다.

1. T accesses i before U and T accesses j before U. 
2. U accesses i before T and U accesses j before T

Dirty reads

write 트랜잭션이 commit 하기 전에 다른 트랜잭션이 read를 할 경우 dirty read 라고 한다.
이때 write가 abort하면 없는 데이터를 읽은 셈이므로 데이터 불일치가 나오게 된다. 만약 read가 먼저 commit을 하고 write가 abort하게 되면 문제가 발생한다.


Cascading aborts

위의 dirty read처럼 하나가 abort했을 경우 다른 트랜잭션들도 연달아 abort해야하는 상태 이다. 이를 피하기 위해서는 read는 write가 commit 한 상태에 읽어야 한다.

Premature writes

동시에 같은 object에 write한 상태이다. (위의 예시) 이를 처리하기 위해서는 write도 또한 r다른 write가 commit 되기 전에 진행하면 안된다. 몇몇 데이터베이스는 이를 처리하기 위해서 write 하기 전의 상태를 기록한다고 한다.

Strict executions of transactions

위처럼 문제가 안나도록 다른 write 트랜잭션이 끝나기를 기다리는것

Nested Transactions

아래와 같이 트리처럼 트랜잭션을 구성.
이렇게 함으로써 다른 트랜잭션끼리 영향을 없게 하여 concorrent하게 됨.
상위 트랜잭션은 하위 트랜잭션이 완료 된 후 commit or abort를 결정.
상위가 abort하면 하위 전부다 abort.
하위가 abort하면 상위는 할지 말지 고를 수 있음.
상위가 commit을 해야 하위가 commit이 됨.

Lock

Lock이라는 것을 통하여 다른 트랜잭션의 접근을 일시적으로 막을 수 있다.

Two-phase locking

2가지 페이즈를 통하여 락을 진행.
첫번째 페이즈 : 락을 받기만 가능.
두번째 페이즈 : 락을 풀기만 가능.

Strict two-phase locking

트랜잭션이 커밋을 하면 recoverability가 보장되기 위해서 저장될때까지 lock을 잡고 있는다.
트랜잭션이 commit 되거나 abort 되기 전까지 lock을 잡고 있는다.
다른 트랜잭션은 같은 object를 접근중에 있는 트랜잭션이 commit하거나 abort할때까지 기다린다.

Lock promotion

다른 lock들과 충돌이 일어나서 진행을 할 수 없는 것을 의미함.

Lock compatibility 

read lock이 다른 read lock은 허용하면서 write lock은 허횽하지 않는 것.
dd

Deadlocks

lock을 기다리기 위해서 트랜잭션이 서로 기다리는데 더이상 진행할 수 없는 상태.
아래와 같이 서로가 서로의 lock을 기다리는 상황을 의미 한다.



wait for graph

아래와 같이 그래프를 그려서 데드락을 확인.
사이클이 있으면 안된다. 따라서 특정 트랜잭션을 abort 시키면 데드락을 풀수도 있다.

Deadlock detection

위의 wait for 그래프를 사용.
사이클을 깨기 위해서 특정 트랜잭션을 무조건 abort 시켜야 한다.
아래에서 T,U,V는 C에 read lock. 
W는 B에 write lock중에 있다.
V가 B에 write lock을 기다리는 중에 있다.
이에 추가로 T와 W가 C에 write lock을 기다리는 중이며 그로 인하여 데드락이 발생.
여기서 V를 abort 시킬 경우 사이클이 분리되기 때문에 데드락이 사라진다.
아래와 같이 관계를 그릴 수 있다.
사이클이 판명될경우 특정 트랜잭션을 abort 시켜야하는데 그냥 할수는 없으니 aging, 사이클 갯수를 고려

댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법