[Day3] 讀 RDBMS 課程 2019 - Race Condition
By Triton Ho
At Lesson 1: Page 1 - Page 13
Notes
Why is isolation important?
- 正規化的基礎訓練,能讓你設計系統時能跟蹤前人的智慧,而不是自行發明看起來沒問題的演算法
- 避免 race condition
為了最大化效能, RDBMS 會同時處理盡量多的 TX
Race Condition
Race Condition 的必需條件
- 同一資源會被同時改動
- 「檢查」和「資料改動」不是在同一 Atomic operation 中完成
註:這是假設有 atomic WRITE 的情況下
Safe Case 1
- 讓同一航班所有資料改動都要先拿到該航班 WRITE LOCK ,改動完成後便解除 WRITE LOCK => Eg. Zookeeper Redis
- 缺點: WRITE LOCK 的伺服器可能會當機
Safe Case 2
- 為每一航班建立對應的 Queue ,並且,對同一航班的改動,必須先把工作放到對應的 Queue ,然後單線程順序執行
- 因為同一時間只有一個線程正在改動同一份資料,所以不會發生 Race condition
- 缺點:
- 麻煩: need MQ Server, worker, server push...
- Some scenarios do not fit (eg. money transfer)
Safe Case 3
-
善用 RDBMS 的 Atomicity 還有 Isolation
Update seats set user = $user where flight_no='BR855' and flight_date = '16SEP' and user IS NULL; <!-- user IS NULL is important -->
- And use
AffectedRowCount
to check it
- And use
-
Keyword: atomic check-and-set