在“数据库系统概念 - 第 15 章 并发控制 - 15.5 基于有效性检查的协议”中,有这么一段话:
事务 Ti 的有效性测试要求任何满足 TS(Tk)<TS(Ti)的事务 Tk 必须满足下面两条件之一:
我的疑问是:关于第 2 点,因为已经给出了“TS(Tk)<TS(Ti)”这个条件,所以一定会满足“TS(Tk)<TS(Ti)<Finish(Ti)”即“Validation(Tk)<Finish(Ti)”,也就是 Ti 的写一定是发生在 Tk 的读之后,这个条件就能够证明“Ti 不可能影响 Tk 的读”了。为什么还需要“Tk 的写阶段在 Ti 开始其有效性检查阶段之前完成( Start(Ti) < Finish(Tk) < Validation(Ti))”呢?不是“Tk 所写的数据项集与 Ti 所读数据项集不相交”就足够了吗?
1
aijam 2020-06-26 13:04:17 +08:00
第 2 点其实就是说两个事务如果运行时间有重合的时候怎么办。
你看看第七版原版说得是不是合理。ppt 第 50 页: https://www.db-book.com/db7/slides-dir/PDF-dir/ch18.pdf (你会发现这书说得颠三倒四,ppt 和第 6 版说得好像是同一件事情,但是语序换了一下可以让读者理解成完全不同的事情。) |
2
JasonLaw OP @aijam 其实两个版本说的是一样的,只不过事务的名称变了而已。我不明白的是为什么还需要“Tk 的写阶段在 Ti 开始其有效性检查阶段之前完成( Start(Ti) < Finish(Tk) < Validation(Ti))”。
|
3
aijam 2020-06-26 13:25:20 +08:00
如果 Tk 还没有写完,Ti 的 validation 无法判断“Tk 所写的数据项集与 Ti 所读数据项集不相交”。
|
4
JasonLaw OP @aijam 你说得对,那么说,不是应该将“ Tk 所写的数据项集与 Ti 所读数据项集不相交,并且 Tk 的写阶段在 Ti 开始其有效性检查阶段之前完成( Start(Ti) < Finish(Tk) < Validation(Ti))”替换成“ Tk 的写阶段在 Ti 开始其有效性检查阶段之前完成( Start(Ti) < Finish(Tk) < Validation(Ti)),并且 Tk 所写的数据项集与 Ti 所读数据项集不相交”吗?
|
5
aijam 2020-06-26 13:54:32 +08:00
所以我说这书语序有问题,ppt 就是你说的语序。
|
6
JasonLaw OP @aijam 😂明白了,谢谢🙏。不过很奇怪,这个错误没有在 https://www.db-book.com/db6/errata-dir/errata-part4.pdf 列出。
|
7
aijam 2020-06-26 14:10:10 +08:00
也说不上是错误,更多是自然语言的局限性。如果从逻辑学来看,and 满足交换律,A and B = B and A ;从计算角度看,A and B 是先判断 A 在判断 B 。如果不比较几个版本,你也看不出作者到底想说什么语义。
|
8
JasonLaw OP 我觉得它们之间还是存在依赖性的,只有满足“Tk 的写阶段在 Ti 开始其有效性检查阶段之前完成”,才能进行“Tk 所写的数据项集与 Ti 所读数据项集是否相交”的判断。
|