我对读取提交的隔离级别有点困惑。如果事务 X(启动)读取一行,更改该行并再次读回该行,这是否被视为特定隔离级别的脏读?
事务始终可以读取它所做的更改,无论其事务隔离级别如何。 这不是一个肮脏的阅读。
已读已提交表示您的事务将看到其他事务所做的最新提交更改。
读取未提交意味着您的事务可以看到其他事务中所做的更改,即使它们尚未提交。这是一个肮脏的阅读。这真的不太可能是你想要的。
重新发表您的评论。
假设我有一个书店的应用程序。有人试图购买100本最新的丹·布朗(Dan Brown)的书。 首先,我的应用程序将书籍的库存更新为零,然后尝试验证他们的信用卡。他们的信用卡没有足够的信用来支付100本这本书,所以它被拒绝了。然后事务回滚,恢复原始库存数量的书籍。
同时,您的应用正在监控库存水平,以查看何时重新订购图书。如果使用 READ UNCOMMITTED,则可以轻松看到库存减少到零。也就是说,在我的应用程序更新之后,但在回滚之前。您的应用非常高效,它会立即向出版商发送新订单,以获取一箱新书。
几天后,你收到了额外的一盒书,但你还有旧书,所以你在书架上没有空间,多余的盒子留在过道里,直到有人绊倒它并伤害自己。 :-(
如果你只使用READ COMMITTED,你就不会对某人的脚踝扭伤负责。
READ COMMITTED
隔离级别可以防止MySQL上的脏读。
下表显示了根据我的实验,MySQL上的每个隔离级别中都出现了哪些问题。 * Yes
表示发生,No
表示不发生:
隔离级别 | 脏读 | 不可重复读取 | 幻影读取 |
---|---|---|---|
读取未提交 | 是的 | 是的 | 是的 |
已提交读取 | 不 | 是的 | 是的 |
可重复读取 | 不 | 不 | *否(基本上) |
序列 化 | 不 | 不 | 不 |