确定合适的隔离级别

Cel*_*tas 6 rdbms postgresql optimization isolation-level

这是一道作业题。

对于以下事务,说明将在不降低数据库完整性的情况下最大化吞吐量的隔离级别。解释答案。

将 coursed_id = 'CPSC1350' 标识的课程从一个部门更改为另一个部门。

Courses 表包含有关课程的信息:课程 ID、名称、提供课程的部门、讲师的 ID 以及可以参加课程的最大学生人数 (max_size)。课程(coursed_id:string,cname:string,dept:string,instructor_id:string,max_size:integer) – 主键:coursed_id – 外键:instructor_id 引用 Instructors

假设使用 PostgreSQL。

我相信可以使用提交的读来完成事务,因为

  • 脏读不好,因为有更新正在进行,因此涉及读取
  • 不可重复读取是可以的,因为其他人不太可能更改该值
  • 幻影是可以的,因为没有SELECT陈述

我在正确的轨道上吗?

a1e*_*x07 3

这个问题看起来像一个谜题,看起来很简单,但也许并不那么简单,或者它只是假装很复杂......我会尽力回答我所理解的问题。如果我误解了一些明显的提示,我深表歉意。

\n\n

有了 PostgreSQL,就没有真正的Read uncommitted- 你得到了Read committed。引用文档

\n\n
\n

在 PostgreSQL 中,您可以请求四种标准事务隔离级别中的任何一种,但在内部仅实现了三种不同的隔离级别,即 PostgreSQL 的Read Uncommitted模式行为如下Read Committed. 这是因为它是将标准隔离级别映射到 PostgreSQL 的多版本并发控制架构的唯一明智的方法。

\n
\n\n

这个问题对我来说听起来不太清楚,因为当您同时进行查询并且没有提到其他查询时,隔离级别很重要,所以如果我错过了什么,请不要太责怪我。

\n\n

如果我们将剩余的隔离级别按照“已提交读”->“可重复读”->“可序列化”的顺序排列,则开销会相应增加。所以我们需要以相同的顺序检查它们,一旦我们满意,就不需要检查剩余的级别(它们会很好,但开销更大)。据我了解,UPDATE Courses set dept = \'New department\' coursed_id = \xe2\x80\x99CPSC1350\xe2\x80\x99完成了所需的工作。从 描述读取已提交隔离级别的Postgre 文档中,

\n\n
\n

在搜索目标行方面,UPDATE、DELETE、SELECT FOR UPDATE 和 SELECT FOR SHARE 命令的行为与 SELECT 相同:它们只会查找截至命令开始时间已提交的目标行。然而,这样的目标行在被发现时可能已经被另一个并发事务更新(或删除或锁定)。在这种情况下,潜在的更新程序将等待第一个更新事务提交或回滚(如果仍在进行中)。如果第一个更新程序回滚,则其效果将被否定,第二个更新程序可以继续更新最初找到的行。如果第一个更新程序提交,则第二个更新程序将忽略第一个更新程序删除的行,否则它将尝试将其操作应用于该行的更新版本。重新评估命令的搜索条件(WHERE 子句),以查看该行的更新版本是否仍然与搜索条件匹配。如果是,则第二更新器使用该行的更新版本继续其操作。

\n
\n\n

我想说我对这种情况下的这种行为感到满意,所以我会同意,READ COMMITTED除非问题中没有提到其他限制。

\n