트랜잭션이 동시에 일어날 경우 case1
트랜잭션이 동시에 일어날 경우 case2
트랜잭션이 동시에 일어날 경우 case3
트랜잭션이 동시에 일어날 경우 case4(Lost Update 현상)
실행순서 간소화 시키기
하나의 작업을 operation이라고 한다.
위의 그림과 같이 여러 transaction들이 동시에 실행될 때 각 transaction에 속한 operation들의 실행 순서를 Schedule이라고 한다. 그리고 각 transaction 내의 operations들의 순서는 바뀌지 않는다.
case1와 case2는 transaction들이 겹치지 않고 한 번에 하나씩 실행되는 schedule이다.(Serial schedule)
case3와 case4는 transaction들이 겹쳐서 실행되는 schedule이다.(Nonserial schedule)
Serial schedule 성능
- r2(H)작업이 일어날 때 I/O작업이 일어난다. I/O작업이 일어날 때 동안은 CPU가 아무것도 하지 않는다.
- 다른 트랜잭션을 사용할 수도있지만 Serial schedule이기 때문에 CPU가 아무것도 하지 않는다.
- 한번에 하나의 트랜잭션만 실행을 하니까 이상한 데이터를 만들 가능성이 없다.
- 하지만, 한 번에 하나의 transaction만 실행되기 때문에 좋은 성능을 낼 수 없고 현실적으로 사용할 수 없는 방식이다.
Nonserial schedule 성능
- I/O작업이 일어날 때 CPU는 노는것이 아니라 또 다른 transaction을 실행시킨다.
- transaction들이 겹쳐서 실행되기 때문에 동시성이 높아져서 같은 시간 동안 더 많은 transaction들을 처리할 수 있다.
- transaction들이 어떤 형태로 겹쳐서 실행되는지에 따라 이상한 결과가 나올 수 있다.
- Nonserial schedule이 Serial schedule보다 더 빠르다.
고민거리
- 성능 때문에 여러 transaction들을 겹쳐서 실행할 수 있으면 좋다.(nonserial schedule)
- 하지만 이상한 결과가 나오는 것은 싫다.
- nonserial schedule로 실행해도 이상한 결과가 나오지 않을 수 있는 방법을 연구하기 시작
- 아이디어 - serial schedule과 동일한(equivalent) nonserial schedule을 실행하면 되겠다!
Conflict - 두개의 operations을 사용하는 개념이다.
세 가지 조건을 모두 만족하면 conflict
- 서로 다른 transaction 소속
- 같은 데이터에 접근
- 최소 하나는 write operation(최소하나는 write)
3가지 조건이 만족하면 두개의 operations는 Conflict하다라고 말할 수 있다.
- r2(H)와 w1(H)는 색이 달라서 서로 다른 transaction 소속이다.
- 둘다 H에 접근해서 같은 데이터에 접근한다.
- w1는 write opeation이다.(최소하나는 write operation)
결과적으로 r2(H)와 w1(H)는 Conflict하다라고 말할 수 있다.
하나는 읽고 하나는 쓰는 이런 형태의 Conflict는 read-write conflict라고 한다.
위의 예시도 read-write conflict이다.
위의 예시는 write-write conflict이다.
결과적으로 sched.3은 총 3개의 conflict가 존재한다.
conflict operation은 순서가 바뀌면 결과도 바뀐다.
ex) w2(H) -> r1(H)순서가 있는데, w2(H=230)에서 H의 계좌에서 230을 썼다. 그리고나서 r1(H)는 H의 계좌를 읽으면 230을 읽는다.
그러나 r1(H) -> w2(H)순서로 바뀌면, r1(H)는 기존의 계좌의 잔액 200을 읽는다. 그리고나서 w2(H=230) H계좌의 230만원을 쓴다.
결과적으로 순서가 바뀌어서 결과가 바뀐것을 알 수 있다.
위의 문제점을 보완한 것
Conflict equivalent(for two schedules)
- 두개의 schedules이 두 조건 모두 만족하면 conflict equivalent
- 두 schedule은 같은 transaction들을 가진다.
- 어떤 conflicting operations의 순서도 양쪽 schedule 모두 동일하다.
- 두개 schedules모두 같은 transaction을 가져서 1번조건에 만족한다.
- sched.3에서 r2(H)가 먼저 실행되고 w1(H)가 나중에 실행된다. sched.2에서도 r2(H)가 먼저 실행되고 w1(H)가 나중에 실행된다. 그래서 2번 조건을 만족한다.
sched.2는 serial schedule이다. 그래서 sched.3입자에서는 conflict equivalent하다.
그래서 serial schedule과 conflict equivalent일 때 Conflict serializable이라고 한다.
결국 nonserial sched.3는 conflict serializable이다.
고민거리
- 성능 땜누에 여러 transaction들을 겹쳐서 실행할 수 있으면 좋다.(nonserial schedule)
- 하지만 이상한 결과가 나오는 것은 싫다.
해결책
- conflict serializable한 nonserial schedule을 허용하자! 하지만, 구현하기에는 힘들다.
그래서 여러 transaction을 동시에 실행해도 schedule이 conflict serializable하도록 보장하는 프로토콜을 적용