Skip to content

Commit

Permalink
Merge pull request #155 from ZvanYang/patch-8
Browse files Browse the repository at this point in the history
Update ch7.md
  • Loading branch information
yingang authored Dec 15, 2021
2 parents 5249ccf + 4b7df23 commit fa1ada4
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions ch7.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]: 可以说邮件应用中的错误计数器并不是什么特别重要的问题。但换种方式来看,你可以把未读计数器换成客户账户余额,把邮件收发看成支付交易。

Expand Down Expand Up @@ -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看到的帐户余额时确实在阅读时已经提交了。

Expand Down

0 comments on commit fa1ada4

Please sign in to comment.