제일 처음 예를 보면, R2(A)는 W1(A)를 읽어서 depends on 하지만, after T1 commit이다. 따라서 recoverable이다.
마찬가지로 T2는 T1에 depends on 하고 T2의 commit은 T1의 commit 다음이다.
세 번째에서는 아예 commit이 없으므로 괜찮다.
네 번째는 commit이 없으므로 괜찮다.
다 섯번째는 non-recoverable이다.
1~4번째는 recoverable하지만 2~3은 ACA는 아니다.
S1은 ACA가 아니다 왜냐하면 R2(X)는 W1(X)에 depends on 하지만 R2(X)이전에 C1이 없기 때문이다. 하지만 commit이 없기 때문에 recoverable 하다.
S2는 C2가 C1이 나타나기 전에 있기 때문에 not recoverable이다. 따라서 당연히 Not ACA이다.
S3는 ACA이고 recoverable이다.
W1(X), R2(Y), R1(Y), C1, R2(X), C2 로 바꾸면 ACA이다.
W1(X), R2(Y), R1(Y), R2(X), C1, C2 로 바꾸면 recoverable이다.
W2(X)와 W1(Y)만 swap하면 T1T2T3가 된다. 따라서 Serializable이다.
What if T1 aborts (i.e., Change C1 into A1)?
W1(Y)가 undo되어야한다는 뜻이다. 하지만 nobdy reads Y이고 nobody overwrites Y이므로 그냥 뒤돌리면 된다. (이해 안가면 cascading aborts에서 w1w2를 봐라)
What if T2 aborts?
W2(X)를 되돌리면 W3(X)도 되돌려야한다. 즉 T3도 영향을 받는다.
2PL은 Two Phase Locking으로 조금 있다가 나온다.
W1(A), R2(A)는 T1 -> T2이고 W2(B) -> R1(B)는 T2 -> T1이므로 cycle이다. 따라서
W1(A)에서 락을 걸었으니 T2는 기다려야한다. T2의 모든 subsequent action은 락이 걸린다. 그래서 R1(B)가 shared lock을 얻는다.