【问题标题】:Conflict serializability and why 2 reads are not conflicting?冲突可串行化以及为什么 2 次读取不冲突?
【发布时间】:2014-04-15 15:53:17
【问题描述】:

从我读到的分析事务的基本方法是冲突可序列化的概念。
所以数据库系统必须通过这种方式保证事务的调度等价于可序列化。
但在这个简单的例子中,我看不出这个模型是如何工作的。
假设如下:

T1  
READ(A)  
A = A - 50  
WRITE(A)  

和事务2:

T2  
READ(A)  
A = A - 50  
WRITE(A)  

根据冲突可串行化,只有WRITE(A) 有冲突。但除此之外或可能的执行可能是:
T1 和 T2 同时做READ(A)。结果,每个人都读取了原始值。所以最终结果是A - 50,而不是A -50 -50,这是串行执行的结果。

所以从我的角度来看,这 2 个读取 是冲突的(但冲突等效理论认为它们不冲突)

所以我不明白该方法如何涵盖这个基本示例,而且这是具有 REPEATABLE READ 隔离级别的数据库中的标准执行。

【问题讨论】:

    标签: mysql sql concurrency transactions isolation-level


    【解决方案1】:

    根据冲突可串行化WRITE 操作与READWRITE 操作冲突。因此,即使每个READ (A) 不与另一个冲突,它也会与另一个事务的WRITE (A) 指令冲突。 如需更深入的解释,您可以考虑查看 Abraham Silberschatz 等人的“数据库系统概念”。人。第6版第14.6章应该澄清一下。

    编辑:根据我之前所说的,并补充说,当且仅当它可以从串行的(不能并行执行的交易对)交换顺序时,调度是可冲突序列化的对彼此不冲突的指令,很明显,冲突可串行化调度对任何数据库的影响将等同于串行调度。因此,我们可以得出结论,冲突可序列化赋予一致性。

    话虽如此,数据库管理器可以实现或不实现这种调度,对事务的一致性产生相应的影响。

    【讨论】:

    • 这无关紧要。因为没有什么能阻止 READ(A) 在两个事务中使用相同的值。顺便说一句,那是我正在读的书(不幸的是)。
    • 一个调度是可冲突序列化的,如果它可以从一个串行的调度中导出,只需交换彼此不冲突的指令对的执行顺序。您的示例的串行计划将执行 T1,然后执行 T2,反之亦然。无论哪种情况,您都不能将一个中的 WRITE(A) 与另一个中的 READ(A) 交换,因此在任何 WRITE(A) 之前执行两个 READ(A) 指令的情况是不可能的。
    • 1)我认为您正在倒退。通过交换非冲突指令(反之亦然),时间表等同于串行时间表。 2)试一试。只需在 MySQL 中打开 2 个客户端会话并运行包含在 BEGIN-COMMIT 中的代码。最终结果是A-50 而不是A -50 -50。这意味着 both 都读取了原来的 A
    • 回答您的第 1 点),当且仅当您可以执行反向路径(即解决冲突-串行一交换非冲突指令的可串行化一)。关于第 2 点),我不知道您尝试了什么以及如何完成测试,但我相信您将每条指令作为独立事务而不是原子事务(T1 或 T2)的一部分执行。也许我错了,我想知道你遵循的过程来找出答案。
    • 对于您询问的过程,请参阅 dba.stackexchange.com/questions/60681/…akuzminsky 的测试
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2011-07-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多