Skip to content

Project5

iQuQi edited this page Jul 27, 2021 · 1 revision

Transaction Management

0.Project5

  • 이번 프로젝트는 다수의 사용자가 서비스를 이용하는 멀트스레드 동작 중 동시성 제어를 위해 필요한 Transaction manager를 구현하여 데드락을 감지하고 제어할 수 있게한다.

  • 지원해야할 기능은 크게 4가지로 transaction의 begin,commit과 db의 update기능,find기능 이다.

  • update와 find 사용 시 동시성 제어를 위해 제공되는 lock table의 lock 오브젝트를 사용하게 되며 어떤 action 인지에 따라 다른 mode로 lock을 획득하게 된다.

  • trx이 시작되면 trx객체 생성 후 trx 테이블에 연결시키게 되고 이 후 find와 update의 action들이 수행된다. 문제없이 전부 수행이 되면 commit을 통해 잡고 있던 lock 오브젝트를 release한다.

  • 데드락이 감지되면 즉시 해당 trx를 abort하여 잡고 있던 모든 lock을 해제하고 write 모드 였던 경우 원래의 value값으로 돌려준다.

  • 동시성 제어를 위해 project 4에서와 달리 추가적인 mutex가 필요한데, buffer latch와 trx latch이다. 각각 버퍼 풀과 trx 테이블을 잠궈주는 역할을 한다.

  • 레코드락을 잡는 과정은 다음과 같다.

  • 버퍼락 -> 페이지 탐색 -> 페이지 발견 ->페이지 락 -> 버퍼 언락 -> 레코드 획득시도 직전에 페이지 언락 -> 레코드 획득 기다리기 -> 레코드 획득 -> 페이지 락 -> 수정/읽기 -> 페이지 해제 -> 레코드 해제(commit 시점)


1.Lock mode

1)Exclusive Mode (write)

  • 레코드의 값을 수정할 시에 잡게 되는 lock의 모드이다.

  • 해시 lock 테이블에서 해당 레코드의 노드에 락을 달아줄 때 E모드는 오직 자신만이 해당 레코드를 사용해야 하므로 다른 lock이 앞에 이미 있다면 무조건 기다리게 된다.

  • db_update함수 호출 시 해당 레코드를 갖고 있는 페이지를 읽어오게 되는데 이 과정에서는 S모드로 락들을 잡고 해제하며 탐색한다.

  • 이 후 페이지를 받아오고 E모드로 락을 잡은 후 레코드를 수정하고 이 후 페이지 락을 해제해준다.


2)Shared Mode (read)

  • 레코드의 값을 읽기만 할 때 잡게 되는 lock의 모드이다.

  • S 모드는 같은 S 모드의 lock끼리 동시에 공유하여 사용할 수 있기 때문에 해당 레코드 노드에 이미 다른 S모드 lock이 잡혀있어도 공유하여 락을 획득하여 사용할 수 있다.

  • 대신 E모드로 락이 앞서 잡혀있는 경우 기다려야 한다.

  • db find 함수 호출 시 해당 레코드를 갖고 있는 페이지를 읽어오는 과정에서 S모드로 lock을 잡고 해제 하며 탐색한다.

  • 해당 페이지를 발견하면 S 모드로 다시 락을 잡은 후 값을 읽는다.


2.Deadlock Detection

1)Deadlock (교착 상태)

  • 서로 원하는 것이 상대방에게 할당되어 있어 서로 무한정 상대를 기다리게 되는 상황을 말한다.

  • 이 프로젝트의 경우 여러 스레드가 동시에 락을 획득하기 때문에 데드락 상황이 발생하게 된다.

  • 예시 : S1 E2 E1 또는 E1 E2 S3 & W3 W1


2)Detection

  • 먼저 lock acquire 함수를 호출하게 되면 락을 획득하고 바로 사용할 수없어 기다려야 될 때 wait 상태에 들어가기 전에 데드락 검사를 하게 된다.

  • 해당 레코드에 달려있는 락들 중 깨어있는 락을 대상으로 검사를 하게 된다.

  • 깨어있는 레코드들의 주인 trx 정보를 읽어와서 해당 trx의 lock 리스트 따라 가면서 혹시 자신을 기다리고 있지는 않은지 검사한다.

  • 사이클이 형성되면 데드락이 발생한 상황이다.


3)예외

  • 자신이 이미 해당 레코드에 대한 락을 갖고 있는 경우가 발생한다.

  • 경우 1 : s2 s1 s3 <- w1 , 이 경우 s->w로 업그레이드 하여 s2 s3 w1(sleep) 상태로 만들어준다.

  • 경우 2 : s1 <- w1 이경우 s1을 w1로 업그레이드하고 w1(wake) 상태로 만들어준다.

  • 경우 3 : s1 <- s1, 락을 새로 잡을 필요없이 원래의 락을 돌려준다.

  • 경우 4 : s2 s3 s1 s4 <-s1 이 경우도 락을 새로 잡을 필요없이 원래의 락을 돌려준다.

  • 경우 5 : w1 <- s1 , 이 경우 업그레이드 할 필요없이 w1 락을 돌려준다.

  • 경우 6 : w1 <- w1 새 락을 잡을 필요 없이 원래의 락을 돌려준다.

3.Abort and Rollback

1)Abort

  • 데드락이 감지되면 해당 trx을 abort 시켜줘야한다.

  • trx의 lock리스트를 따라서 하나씩 release를 해주는데 이때 write를 한 경우 rollback이 필요하다.

  • lock들의 해제 모두 끝나면 trx 테이블에서 trx 객체를 삭제시킨다.

  • trx이 서로 맞물려서 데드락이 발생하면 하나를 abort시켜서 cycle을 끊어준다.


2)Rollback

  • rollback이란 데이터베이스에서 업데이트 오류 발생 시 값을 이전상태로 되돌리는 것을 말한다.

<1> Shared Mode (read)

  • 이 경우 수정한 것이 없기 떄문에 rollback이 필요가 없다.

<2> Exclusive Mode (write)

  • write로 원래의 값을 변경했기 때문에 rollback이 필요하다.

  • lock 오브젝트가 수정 후, 이전의 값을 보유하고 있고 이 후 abort가 발생하면 그 값으로 덮어 씌운다.

Clone this wiki locally