我感到有点蠢,不过为了澄清事情,有时候必须问一些蠢问题 :)
所以,我们可以像Martin Kleppmann在他的演讲中那样定义写偏斜:
写偏斜模式: 1. 读取某些内容 2. 做出决定 3. 写出决策 当写操作(3)提交时,决策(2)的前提(1)已不再成立
有一种悲观的方法,基本上是说“在给定的时刻只有一个主题可以使用共享资源,其他人应该等待主题完成”。
然后有一种乐观的方法,其中定义了维基百科中的阶段:
I. 开始:记录标记交易开始的时间戳。 II. 修改:读取数据库值,并暂时写入更改。 III. 验证:检查是否有其他事务修改了该事务使用的数据(包括读取或写入)。这包括在此事务开始时间之后完成的事务,以及可选地,在验证时间仍处于活动状态的事务。 IV. 提交/回滚:如果没有冲突,则使所有更改生效。如果存在冲突,则通过通常是放弃事务的方式解决它,尽管可能还有其他解决方案。
我的问题是,在进行验证(III)时,我们有什么保证新的“知识”不会被写入,从而实现了上述的写偏斜定义?
基本上,验证模块在第三阶段必须保留一些内部分类帐,并以串行方式处理它们,使得来自事务2的检查过程不会发生在事务1的写入事件之前。
我们只是将写偏斜问题下移一级吗?因此,我们在低层采用可串行悲观方法以便在更高层采用乐观方法?我理解对吗?
我很感激任何澄清。
所以,我们可以像Martin Kleppmann在他的演讲中那样定义写偏斜:
写偏斜模式: 1. 读取某些内容 2. 做出决定 3. 写出决策 当写操作(3)提交时,决策(2)的前提(1)已不再成立
有一种悲观的方法,基本上是说“在给定的时刻只有一个主题可以使用共享资源,其他人应该等待主题完成”。
然后有一种乐观的方法,其中定义了维基百科中的阶段:
I. 开始:记录标记交易开始的时间戳。 II. 修改:读取数据库值,并暂时写入更改。 III. 验证:检查是否有其他事务修改了该事务使用的数据(包括读取或写入)。这包括在此事务开始时间之后完成的事务,以及可选地,在验证时间仍处于活动状态的事务。 IV. 提交/回滚:如果没有冲突,则使所有更改生效。如果存在冲突,则通过通常是放弃事务的方式解决它,尽管可能还有其他解决方案。
我的问题是,在进行验证(III)时,我们有什么保证新的“知识”不会被写入,从而实现了上述的写偏斜定义?
基本上,验证模块在第三阶段必须保留一些内部分类帐,并以串行方式处理它们,使得来自事务2的检查过程不会发生在事务1的写入事件之前。
我们只是将写偏斜问题下移一级吗?因此,我们在低层采用可串行悲观方法以便在更高层采用乐观方法?我理解对吗?
我很感激任何澄清。