Transaction Locking Transaction Transaction1 Begin work Perform some
Transaction & Locking • Transaction – 資料庫運作時的邏輯單位
單人的Transaction-1 Begin work Perform some SQL Rollback
單人的Transaction-2 Begin work Perform some SQL Commit
多人的Transaction • Undesirable Phenomena(不受歡迎份子) • Dirty Read(讀取資料受影響) • Unrepeatable Reads(重複讀取無法相同) • Phantom Reads(虛讀資料) • Lost Updates(遺失更新)
多人Transaction範例-1(Dirty Read) Transaction 1 由 1所看到的data 另一個transaction可能 看到的data read 假如dirty read沒發生 另一個transaction看到的是 David Dave Dave David Dave Begin work 將custome 15更新成 Dave Commit 將custome 15更新成 David Rollback
多人Transaction範例-2 (Unrepeatable Reads) Transaction 1 由 1所看到的data 另一個transaction可能 看到的data read 假如dirty read沒發生 另一個transaction看到的是 David Dave David Dave Commit Begin work Dave Begin work 將custome 15更新成 Dave Commit 顯示custome 15的狀態
多人Transaction範例-3 (Phantom Reads) Transaction 1 Transaction 2 Begin work Update item set sell_price=sell_price+1; Commit Insert into item(…) values(…); Commit
多人Transaction範例-4 (Lost Updates) User 1看到的data User 2 嘗試將售價由 21改成 22 嘗試將成本由 15改成 16 Begin work 顯示成本和售價 (select…. from. . ) 15, 21 將售價 21改成 22 (update … where …) 15, 22 顯示成本和售價 (select … from …) Commit 15, 21 15, 22 Commit User 2看到的data 16, 21 將成本 15改成 16 (update … where …) 16, 21
多人Transaction範例-4 (Lost Updates) User 1看到的data User 2 嘗試將售價由 21改成 22 Begin work 讀取售價 21 將售價由 21改成 22 (update … where …) 22 讀取售價 User 2看到的data 21 21 Commit 22 將售價由 21改成 22 (update … where …) 更新失敗
ANSI / ISO定義 ANSI / ISO 定義 Dirty Read Unrepeatable Read Phantom Read Possible uncommitted Possible Read committed Not Possible Repeatable Read Not Possible Serializable Not Possible
Transaction限制 • 不能巢狀使用Transaction • 保持小量的Transaction
Deadlock Session 1 Session 2 Update row 8 Update row 15 Update row 8 此一時間點,兩個Session都被封鎖,因為否此想要的資料 都在對方Lock的Table中
- Slides: 14