首页 > 解决方案 > 阅读未提交的更新

问题描述

考虑一个包含 {(1),(2)} 的表 R(A)。

假设交易

T1: UPDATE R SET A = 2*A

T2: SELECT AVG(A) FROM R

如果事务 T2 使用“读取未提交”执行,它返回的可能值是什么?

我的猜测是它可以返回 1.5、2、2.5 或 3,因为读取未提交以及元组的顺序并不重要,正如我从课程中理解的那样。我说得对吗?

标签: mysqlsqlconcurrencytransactions

解决方案


来自MySQL文档READ UNCOMMITTED

SELECT 语句以非锁定方式执行,但可能会使用行的早期版本。因此,使用这个隔离级别,这样的读取是不一致的。这也称为脏读。否则,此隔离级别的工作方式类似于 READ COMMITTED。

脏读可能会在更新发生之前、期间或之后查看表。这意味着,正如您所指出的,表观平均值可能是 1.5、2、2.5 或 3。考虑:

R1 | R2 | average
1  | 2  | 1.5        <-- update not yet started
2  | 2  | 2          <-- update in progress
1  | 4  | 2.5        <-- update still in progress
2  | 4  | 3          <-- update completed

推荐阅读