From 4b7df23238f81483cdf97a9ae2d1735afa98f649 Mon Sep 17 00:00:00 2001 From: Zhaoyang Date: Tue, 14 Dec 2021 23:15:27 +0800 Subject: [PATCH] Update ch7.md or neither, but not an inconsistent halfway point. --- ch7.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ch7.md b/ch7.md index 1881320e..eeaba646 100644 --- a/ch7.md +++ b/ch7.md @@ -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看到的帐户余额时确实在阅读时已经提交了。