공유 출발점

같은 비직렬 스케줄도 읽는 시점이 결과를 바꾼다

두 트랜잭션은 같은 데이터 A, B를 함께 갱신합니다. 핵심은 누가 어떤 값을 보고 계산했는지입니다.

초기 상태
A = 100, B = 100

비교는 항상 이 같은 시작값에서 출발합니다.

T1

이체

A에서 50을 빼고 B에 50을 더합니다.

A = A - 50
B = B + 50
T2

잔액 2배

읽은 값을 기준으로 A, B를 각각 두 배로 만듭니다.

A = A * 2
B = B * 2
직렬 가능

T2가 이미 갱신된 값을 읽으면 직렬 실행과 같은 결과가 나온다

T1의 쓰기가 먼저 반영된 뒤 T2가 그 결과를 읽어 계산합니다.

읽기와 쓰기
A: T1이 100을 읽고 50으로 씀
A: T2가 50을 읽고 100으로 씀

B: T1이 100을 읽고 150으로 씀
B: T2가 150을 읽고 300으로 씀
직렬과 비교

T1 → T2 와 동일

비직렬로 섞여 있어도 충돌 순서는 유지됩니다.

직렬 결과 (A=100, B=300)
비직렬 결과 (A=100, B=300)
최종 상태
A 100
B 300
판단 안전
직렬 불가능

T2가 옛 값을 읽고 계산하면 마지막 쓰기가 일부 결과를 덮어쓴다

같은 연산이라도 읽기 시점이 뒤틀리면 어떤 직렬 순서와도 맞지 않는 결과가 생깁니다.

읽기와 쓰기
A: T2가 100을 먼저 읽고 200으로 계산
A: 나중에 T1이 50으로 써서 일부 결과가 사라짐

B: T2가 100을 먼저 읽고 200으로 계산
B: 나중에 T1이 150으로 써서 역시 덮어씀
직렬과 비교

어느 직렬 결과와도 불일치

T1 → T2 (100, 300)
T2 → T1 (150, 250)
실제 비직렬 (50, 150)
최종 상태
A 50
B 150
판단 불일치
학습 포인트

비직렬 스케줄 자체가 문제는 아닙니다. 중요한 것은 교차된 실행 결과가 어떤 직렬 순서의 결과와 같은지 여부입니다. 그래서 다음 단계에서 직렬 가능성으로 안전한 비직렬 스케줄을 판별합니다.