DB
DB 四大重要特性(ACID)
基本要求
多筆 transaction 同時對同一筆資料讀寫跟修改時可能會出現的狀況
Transaction 1 | Transaction 2 |
---|---|
修改商品價格(100元 -> 0元) | |
取得商品價格(0元) | |
Rollback | |
新增訂單(0元) | |
Commit |
Transaction 2 不該讀取到 Transaction 1 尚未 commit 的資料
Transaction 1 | Transaction 2 |
---|---|
取得 A 商品價格(3000元) | |
(其他指令…) | 修改 A 商品價格(4000元) |
(其他指令…) | Commit |
取得 A 商品價格(4000元) | |
新增訂單(4000元) | |
Commit |
Transaction 1 中取得 A 商品的價格應該要一致
Transaction 1 | Transaction 2 |
---|---|
取得 A 商品的積木數(30個) | |
(其他指令…) | 新增 A 商品積木 |
(其他指令…) | Commit |
取得 A 商品的積木數(31個) | |
新增訂單(31個) | |
Commit |
Transaction 1 中取得 A 商品的積木數應該要一致
EX: 同一張票造成多人訂票
Transaction 1 | Transaction 2 |
---|---|
取得票剩餘數(1 張) | |
(其他指令…) | 取得票剩餘數(1 張) |
(其他指令…) | (其他指令…) |
寫入訂票資料 | (其他指令…) |
Commit | 寫入訂票資料 |
Commit |
EX: 點數超支
Transaction 1 | Transaction 2 | Transaction 3 | Transaction 4 |
---|---|---|---|
取得商品資料(10000點) | |||
取得剩餘點數(11000點) | 取得商品資料(10000點) | ||
(其他指令…) | 取得剩餘點數(11000點) | 取得商品資料(10000點) | |
(其他指令…) | (其他指令…) | 取得剩餘點數(11000點) | 取得商品資料(10000點) |
(其他指令…) | (其他指令…) | (其他指令…) | 取得剩餘點數(11000點) |
新增訂單(10000點) | (其他指令…) | (其他指令…) | (其他指令…) |
Commit | 新增訂單(10000點) | (其他指令…) | (其他指令…) |
Commit | 新增訂單(10000點) | (其他指令…) | |
Commit | 新增訂單(10000點) | ||
Commit |
Isolation Levels 有四種等級,各家資料庫皆會宣稱支援到何種等級,一般需要 transaction 情境至少會要求到 Repeatable Read 的等級。選擇 DB System 要考量其支援 Isolation Levels,否則要自行處理 race condition 問題。
分成 shared (S) locks 和 exclusive (X) locks,該筆資料(index records) 被讀取時發行 S lock,修改/刪除時發行 X lock
S lock 可以發給多個 trancaction,所以多個 trancactions 可以讀取同一筆資料。
X lock 只會發給一個 trancaction,且如果該筆資料已發行 S locks 給其他 trancaction 時,將不會發行 X lock。
SX locks 機制即 transaction 讀取時其他 transactions 都可以讀,但 transaction 修改時其他 transactions 將無法讀取。
InnoDB SX locks 提供不同粒度的 lock 種類:
遇到 conflict 時 trancaction 會等待以取得相應 locks,lock 種類越多或 lock 範圍越大,越容易引起 Lock wait timeout。
提升到 Serializable 才會加入 Gap lock & Next-key lock,但容易引起 Lock wait timeout or Deadlock 及大大降低使用效能。
X | IX | S | IS | |
---|---|---|---|---|
X | Conflict | Conflict | Conflict | Conflict |
IX | Conflict | Compatible | Conflict | Compatible |
S | Conflict | Conflict | Compatible | Compatible |
IS | Conflict | Compatible | Compatible | Compatible |
當對資料做變更時 innoDB 會寫入 Undo log,紀錄每個 transaction 變更內容,可依此作為 rollback 依據,並宣稱有 MVCC 功能,其實資料沒有多版本並存,如果 A transaction 出錯要 rollback 時,還原的資料會加上排他鎖(其他 transaction 無法讀取跟寫入),仍會出現無法讀取。
FOR UPDATE
: 類似 MYSQL InnoDB 的 IX, row 在 FOR UPDATE
mode 將不能執行 UPDATE
、DELETE
、其他 Row-level Lock Modes 操作FOR NO KEY UPDATE
: 除了允許 SELECT FOR KEY SHARE
與 FOR UPDATE
相同FOR SHARE
: row 在 FOR SHARE
mode 不能執行 UPDATE
, DELETE
, SELECT FOR UPDATE
or SELECT FOR NO KEY UPDATE
FOR KEY SHARE
: row 在 FOR KEY SHARE
mode 不能執行 UPDATE
, DELETE
, SELECT FOR UPDATE
DynamoDB 提供 TransactWriteItems & TransactGetItems 來執行 transaction, 其宣稱的 Isolation Level 可參考 DynamoDB transaction-isolation
Operation | Isolation Level |
---|---|
DeleteItem | Serializable |
PutItem | Serializable |
UpdateItem | Serializable |
GetItem | Serializable |
BatchGetItem | Read-committed |
BatchWriteItem | NOT Serializable |
Query | Read-committed |
Scan | Read-committed |
Other transactional operation | Serializable |
TransactWriteItems 失敗情境
TransactGetItems 失敗情境