오래 못 할 짓 하지 않기
[ 데이터베이스 ] 14. Concurrency control 본문
저번 예제에 이어서...
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 하도록 보장하는 프로토콜을 적용한다.
(출처)
유튜브 쉬운코
'3학년 1학기 > 데이터베이스(DB)' 카테고리의 다른 글
[ 데이터베이스 ] 16. Isolation Level (0) | 2024.01.14 |
---|---|
[ 데이터베이스 ] 15. Concurrency control(2) - recoverability (0) | 2024.01.13 |
[ 데이터베이스 ] 13. Transaction / ACID (0) | 2024.01.10 |
[ 데이터베이스 ] 12. Trigger (0) | 2024.01.09 |
[ 데이터베이스 ] 11. Stored procedure 를 쓰기 힘든 이유 (0) | 2024.01.05 |