Clojure STM模糊因子

4
在Clojure中,我们使用STM进行并发处理。
我的问题是,STM使用数据的时间点值,这是否会引入歧义?
我们如何知道所访问的值?
2个回答

8

在Clojure中,通过refdosync提供STM事务上下文,从外部世界的视角来看,所有更新都保证在所有涉及到的ref上“同时”进行。

其目标是维护系统中值的一致性,典型示例是在两个银行账户之间转移资金。如果您要从A账户向B账户转移100美元,则希望同时更改A和B的金额。

在此示例中,在事务内处理的金额的读取值实际上没有歧义,因为在执行从事务外部进行读取时,只有以下情况是可能发生的:

  1. 事务已经开始但尚未完成,因此金额尚未被“正式”更改。事务稍后可以提交或重试,但当您读取它们时,那就是每个账户的状态。
  2. 事务已经完成,因此读取的金额是修改后的值。

在事务内部,你只读(不修改)的ref的值可能会从事务的某个点到另一个点发生改变,这被称为写入偏斜(见Clojure Programming - 第4章,Refs,Write Skew)。为了避免这种情况,你可以使用ensure(而不是deref),这将导致如果这些ref的任何一个值发生更改(你只读的那些),则整个事务将重新尝试。


4
Clojurians在这个上下文中使用“时间”和“值”的词语具有非常具体的含义,以消除这种歧义。在这个上下文中,“时间”是“序列中的时间”或时代时间,而不是墙上的时间。因此,时间描述了该标识的值序列中的哪个值
“值”是某一时刻身份的不变内容。这个值可以是简单的(原始或原子值),也可以是由任意结构化的不变值组成的复合值。重要的部分是值不会改变,所以如果您想知道使用了哪个值,只需打印或记录它
我强烈推荐观看值、状态和身份的视频。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接