오래 못 할 짓 하지 않기

[ 데이터베이스 ] 14. Concurrency control 본문

3학년 1학기/데이터베이스(DB)

[ 데이터베이스 ] 14. Concurrency control

쫑알bot 2024. 1. 12. 12:41
728x90

저번 예제에 이어서... 

 

K가 H에게 20만원을 이체할 때

H도 본인 계좌에 30만원을 입금하면, 여러 형태의 실행이 가능할 수 있다.

 

가능한 Case

 

1. K에게 20을 받고, 본인에게 입금한 30넣고

 

 

2. 본인에게 30먼저 입금 , K가 H에게 20 입금

 

3. K가 송금 , 본인에게 30 추가 , K에게 받은 20 추

 

 

4.

1. K 잔고 확인 후 20만원 차감

2. H 잔고 확인 후

3. ( 본인 잔고 확인 후,   

      본인에게 30 추가 )                       → 230만원

4. 2에서 확인한 값에서 20 추가         → 220만원 

 


Transaction 을 이루고 있는 명령어 하나하나를 Operation이라고 한다.

그 Operation을 간략화 시킬 수 있는데

 

- Read = r

- Write = w

- Commit = c

 

▶ 그리고 뒤에 몇 번째 Trans action인지 숫자도 붙여준다

     ex) r1 , w2

 

▶ 그리고 어떤 데이터를 r,w,c하는 건지 확인할 수 있도록 그 뒤에 표시도 해주어야 한다.

     ex) r1(K) , w2(H)

 

이렇게 위 case들을 만들어보면 아래와 같다.

 

 

● Schedule

여러 Transaction 들이 동시에 실행될 때

각 Transaction에 속한 operation 들의 실행 순서

 

※ 각 Transaction 내의 operation 순서는 절대 바뀌지 않는다.

 

● Serial Schedule

Transaction들이 겹치지 않고 한 번에 하나씩 실행되는 schedule

 

- r을 먼저 하는데, 이건 IO작업이다.

이를 수행하는 동안 다른 작업은 이루어지지 않으므로 CPU는 놀고있는다.

따라서 성능이 좋다고는 하기 어렵다.

 

 

장점 : 이상한 결과가 나오지 않을 것이다 ( 꼬여서 lost update 되는 일은 없을 것 )

단점 : 한 번에 하나의 Transaction이 실행되기 때문에 좋은 성능을 낼 수 없다.

 


● Nonserial Schedule

Transaction들이 겹쳐서(interleaving) 실행되는 schedule

 

r2(H) 가 IO작업이다. 이걸 해오는 동안 r1(K) 그냥 실행함 ( serial에서는 안 함 )

 

장점 : Transaction들이 겹쳐서 실행되기 때문에 동시성이 높아진다

          → 같은 시간동안 더 많은 transaction 처리 가능

 

단점 : 어떤 형태로 겹쳐서 실행되는지에 따라 이상한 결과가 나올 수 있다.

 

 

 

 

그럼 성능이 높은 Nonserial을 사용하면서 , 이상한 결과를 피하는 방법은?

 


Conflict (of two operations)

아래 세 가지 조건을 만족하면 Conflict

 

1. 서로 다른 transaction 소속

2. 같은 데이터에 접근

3. 최소 하나는 write operation

r2(H)랑 w1(H)를 분석해보면 ( w2(H) w1(H)  / w2(H) r1(H))

1. 서로 다른 transaction 소속     O  2 ,1 

2. 같은 데이터에 접근                 O  H

3. 최소 하나는 write operation     O w1(H)  

이런 걸 read-write conflict라고 한다.

 

 

● Conflict operation은 순서가 바뀌면 결과도 바뀐다.

이 순서가 바뀌면?

 

앞에서는 r1(H)가 읽는 값이 230

뒤는 r1(H)가 200이다.

 

 

● Conflict equivalent (for two scedule)

두 조건을 모두 만족하면 conflict equivalent

 

1. 두 schedule은 같은 transaction들을 가진다.

2. 어떤 conflicting operations 의 순서도 양쪽 schedule 모두 동일하다.

2번 설명에 대한 예제

conflicting operations의 순서가 같아야 한다는 것

= w2(H) 와 r1(H) 둘 다 순서가 같아야함

- sced.3 에서 w2(H) 먼저 오고 → r1(H)

- sced.2 에서 w2(H) 먼저 오고 → r1(H)

 

둘 다 같음.

 

이렇게 모든 conflicting operations을 보고 순서가 같은지 본다.

 

 

▶ 이렇게 3번 2번 schedule 모두 1,2 조건을 충족했을 때, 

  sched.3 과 sched.2는 conflict equivalent 하다고 한다. 

 

이 때, sched.2는 serial schedule 이다.

sched.3은 nonserial schedule인데 serial schedule 와 conflict equivalent 하다면

이 때, sched.3은 Conflict serializable 하다고 한다. 

 

예2) 이거 두 개 equivalent?

1번 조건은 ㅇㅋ

2번 조건에 대해서는 r1(H) w2(H) 가 순서가 맞지 않음

 

따라서, 4번은 2번과 conflict equivalent 하지 않다.

 

 

 

하지만 serial은 1번도 있기 때문에 얘도 한 번 보자

여기에서도 r2(H) w1(H) 처럼 순서가 맞지 않는 게 또 있다.

 

우리가 보는 예시에서는 serial schedule이 2개가 있는데,

2개 모두 conflict equivalent하지 않기 때문에 

sche.4는 Not conflict serializable하다.

 


 

 

따라서 우리는 성능 + 이상한 결과 X 인 것을 찾기 위해서

Conflict serializable한 nonserial schedule을 찾아서 사용한다.

 

(실제 업무에서)

요청이 많아지면 Conflict serializable 하더라도 꼬일 수 있기에

여러 Transaction을 동시에 실행해도 schdule이 conflict serializable 하도록 보장하는 프로토콜을 적용한다.

 

 

(출처)

유튜브 쉬운코