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
陈述 我在正确的轨道上吗?
这个问题看起来像一个谜题,看起来很简单,但也许并不那么简单,或者它只是假装很复杂......我会尽力回答我所理解的问题。如果我误解了一些明显的提示,我深表歉意。
\n\n有了 PostgreSQL,就没有真正的Read uncommitted
- 你得到了Read committed
。引用文档:
\n\n\n在 PostgreSQL 中,您可以请求四种标准事务隔离级别中的任何一种,但在内部仅实现了三种不同的隔离级别,即 PostgreSQL 的
\nRead Uncommitted
模式行为如下Read Committed
. 这是因为它是将标准隔离级别映射到 PostgreSQL 的多版本并发控制架构的唯一明智的方法。
这个问题对我来说听起来不太清楚,因为当您同时进行查询并且没有提到其他查询时,隔离级别很重要,所以如果我错过了什么,请不要太责怪我。
\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
我想说我对这种情况下的这种行为感到满意,所以我会同意,READ COMMITTED
除非问题中没有提到其他限制。
归档时间: |
|
查看次数: |
670 次 |
最近记录: |