mysql - 阅读未提交的更新
问题描述
考虑一个包含 {(1),(2)} 的表 R(A)。
假设交易
T1: UPDATE R SET A = 2*A
T2: SELECT AVG(A) FROM R
如果事务 T2 使用“读取未提交”执行,它返回的可能值是什么?
我的猜测是它可以返回 1.5、2、2.5 或 3,因为读取未提交以及元组的顺序并不重要,正如我从课程中理解的那样。我说得对吗?
解决方案
来自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
推荐阅读
- asp.net-core-mvc - ASP.NET Core 3.0 中的会话变量
- oracle - 在 oracle 12C 中调用 userenv('commitscn') 失败
- python - 根据条件遍历不同级别的嵌套字典
- mysql - ZF3 - Zend\Db\Sql\Predicate\Expression - SQL DATE_FORMAT 上的错误转义
- java - Swagger/OpenAPI 注释 V3 - 在 swagger 注释中使用枚举值
- c - 与程序在同一目录下的所有文件的加密功能
- python - 使用 Docplex 最大限度地减少延迟百分比
- c# - 是否可以在 winforms 应用程序中使用 c# 从文件中提取元数据?
- javascript - 使用 javascript 复制永久链接
- javascript - 触摸移动不滑动滑动滑块上的多个元素