Concurrency control makes any schedule serializable
➡️ 코드 간소화 적용
Schedule
- 여러 트랜잭션들이 동시에 실행될 때 각 트랜잭션에 속한 operation들의 실행 순서
- 각 트랜잭션 내의 operation들의 순서는 바뀌지 않는다.
Serial schedule
- 트랜잭션들이 겹치지 않고 한 번에 하나씩 실행되는 스케쥴
- 한 번에 하나의 트랜잭션만 순차적으로 실행되므로 좋은 성능을 낼 수 없어 현실적으로 사용할 수 없는 방식
Nonserial schedule
- 트랜잭션들이 겹쳐서(interleaving) 실행되는 스케쥴
- 트랜잭션들이 겹쳐서 실행되므로 동시성이 높아져서 같은 시간 동안 더 많은 트랜잭션들을 처리할 수 있다.
- 단점! : 트랜잭션들이 어떤 형태로 겹쳐서 실행되는지에 따라 이상한 결과를 초래할 수 있다. -> lost update
Conflict ( of two operations)
- 서로 다른 트랜잭션 소속
- 같은 데이터에 접근
- 최소 하나는 write operation
- 세 가지 조건을 모두 만족하면 conflict이다.
- read-write conflict, write-write conflict ...
- conflict operation은 순서가 바뀌면 결과도 바뀐다.
conflict equivalent ( for two schedules)
- 두 스케쥴은 같은 트랙잭션들을 가진다.
- 어떤(any) conflicting operations의 순서도 양쪽 스케쥴 모두 동일하다.
- 두 조건 모두 만족하면 conflict equivalent
- Conflict Serializable : serial schedule과 conflict equivalent일 때
고민 : 성능 때문에 여러 트랜잭션들을 겹쳐서 실행할 수 있으면 좋다. 하지만 이상한 결과가 나오는 것은 싫다!
해결책 : conflict serializable한 nonserial schedule을 허용하자!
구현 : 여러 트랜잭션을 동시에 실행해도 스케쥴이 conflict serializable하도록 보장하는 프로토콜을 적용한다.