mirror of
https://github.com/Vonng/ddia.git
synced 2024-12-06 15:20:12 +08:00
update last merged PR
This commit is contained in:
parent
fa1ada4a0b
commit
48c792c996
2
ch7.md
2
ch7.md
@ -293,7 +293,7 @@ SELECT COUNT(*)FROM emails WHERE recipient_id = 2 AND unread_flag = true
|
||||
|
||||
**图7-6 读取偏差:Alice观察数据库处于不一致的状态**
|
||||
|
||||
爱丽丝在银行有1000美元的储蓄,分为两个账户,每个500美元。现在一笔事务从她的一个账户转移了100美元到另一个账户。如果她在事务处理的过程中非常不幸的查看到其账户余额列表,她可能会在收到付款之前看到一个账户余额(余额为500美元),在发出转账后看到另一个账户余额(新余额为400美元)。对爱丽丝来说,现在她的账户似乎总共只有900美元——看起来有100美元已经凭空消失了。
|
||||
爱丽丝在银行有1000美元的储蓄,分为两个账户,每个500美元。现在有一笔事务从她的一个账户转移了100美元到另一个账户。如果她非常不幸地在事务处理的过程中查看其账户余额列表,她可能会在收到付款之前先看到一个账户的余额(收款账户,余额仍为500美元),在发出转账之后再看到另一个账户的余额(付款账户,新余额为400美元)。对爱丽丝来说,现在她的账户似乎总共只有900美元——看起来有100美元已经凭空消失了。
|
||||
|
||||
这种异常被称为**不可重复读(nonrepeatable read)** 或**读取偏差(read skew)**:如果Alice在事务结束时再次读取账户1的余额,她将看到与她之前的查询中看到的不同的值(600美元)。在读已提交的隔离条件下,**不可重复读**被认为是可接受的:Alice看到的帐户余额时确实在阅读时已经提交了。
|
||||
|
||||
|
@ -144,7 +144,7 @@ SELECT COUNT(*)FROM emails WHERE recipient_id = 2 AND unread_flag = true
|
||||
|
||||
但如果郵件太多,你可能會覺得這個查詢太慢,並決定用單獨的欄位儲存未讀郵件的數量(一種反規範化)。現在每當一個新訊息寫入時,必須也增長未讀計數器,每當一個訊息被標記為已讀時,也必須減少未讀計數器。
|
||||
|
||||
在[圖7-2](../img/fig7-2.png)中,使用者2 遇到異常情況:郵件列表裡顯示有未讀訊息,但計數器顯示為零未讀訊息,因為計數器增長還沒有發生[^ii]。隔離性可以避免這個問題:透過確保使用者2 要麼同時看到新郵件和增長後的計數器,要麼都看不到。反正不會看到執行到一半的中間結果。
|
||||
在[圖7-2](../img/fig7-2.png)中,使用者2 遇到異常情況:郵件列表裡顯示有未讀訊息,但計數器顯示為零未讀訊息,因為計數器增長還沒有發生[^ii]。隔離性可以避免這個問題:透過確保使用者2 要麼同時看到新郵件和增長後的計數器,要麼都看不到,而不是一個前後矛盾的中間結果。
|
||||
|
||||
[^ii]: 可以說郵件應用中的錯誤計數器並不是什麼特別重要的問題。但換種方式來看,你可以把未讀計數器換成客戶賬戶餘額,把郵件收發看成支付交易。
|
||||
|
||||
@ -293,7 +293,7 @@ SELECT COUNT(*)FROM emails WHERE recipient_id = 2 AND unread_flag = true
|
||||
|
||||
**圖7-6 讀取偏差:Alice觀察資料庫處於不一致的狀態**
|
||||
|
||||
愛麗絲在銀行有1000美元的儲蓄,分為兩個賬戶,每個500美元。現在一筆事務從她的一個賬戶轉移了100美元到另一個賬戶。如果她在事務處理的同時檢視其賬戶餘額列表,她可能會碰巧在收款到達前看到收款賬戶的餘額仍然是500美元,而在付款產生後看到付款賬戶的餘額已經是400美元。對愛麗絲來說,現在她的賬戶似乎總共只有900美元——看起來有100美元已經憑空消失了。
|
||||
愛麗絲在銀行有1000美元的儲蓄,分為兩個賬戶,每個500美元。現在有一筆事務從她的一個賬戶轉移了100美元到另一個賬戶。如果她非常不幸地在事務處理的過程中檢視其賬戶餘額列表,她可能會在收到付款之前先看到一個賬戶的餘額(收款賬戶,餘額仍為500美元),在發出轉賬之後再看到另一個賬戶的餘額(付款賬戶,新餘額為400美元)。對愛麗絲來說,現在她的賬戶似乎總共只有900美元——看起來有100美元已經憑空消失了。
|
||||
|
||||
這種異常被稱為**不可重複讀(nonrepeatable read)** 或**讀取偏差(read skew)**:如果Alice在事務結束時再次讀取賬戶1的餘額,她將看到與她之前的查詢中看到的不同的值(600美元)。在讀已提交的隔離條件下,**不可重複讀**被認為是可接受的:Alice看到的帳戶餘額時確實在閱讀時已經提交了。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user