Clojure STM歧义因素

时间:2013-06-19 16:02:19

标签: clojure stm

在Clojure中,我们使用STM进行并发。

我的问题是STM使用数据的时间点值,是不是这引入了歧义?

我们怎么知道访问了什么值?

2 个答案:

答案 0 :(得分:8)

Clojure中的STM(通过refdosync)提供了一个事务上下文,其中所有更新都保证“同时”发送给从外部查看的所有参考世界。

目标是保持系统中价值的一致性,典型的例子是两个银行账户之间的资金转移。如果您从账户A转账到账户B的100美元,那么您将希望同时更改A和B的金额。

在这个例子中,对于在事务中处理的金额读取的值实际上没有歧义,因为在完成事务外部的读取时,只有以下情况是可能的:

  1. 交易已经开始但尚未完成,因此价值尚未“正式”更改。事务可以在以后提交或重试,但是当您阅读它们时,这就是每个帐户的状态。
  2. 交易已完成,因此读取的金额为修改后的值。
  3. 当在事务内部时,您只读取(并且不修改)ref 可以将其值从事务的一个点更改为另一个点,这称为< em> write skew (参见Clojure Programming - 第4章,参考,写歪斜)。为了避免这种情况,你可以使用ensure(而不是deref),这会导致如果这些ref中的任何一个的值发生变化(你只读过的那个),那么整个交易将被重试。

答案 1 :(得分:4)

Clojurians在这种情况下使用具有非常具体含义的“时间”和“价值”来消除这种歧义。在这种情况下,“时间”是“序列中的时间”或划时代的时间,而不是墙上的时间。所以时间描述了此身份的值序列中的哪个值。

价值是在某个时间点身份的不变内容。该值可以是简单的(原始值或原子值)或复合值,并由任意结构化的不变值组成。重要的是值不会改变,所以如果你想知道使用了哪个值,你可以简单地打印或记录它

我在values, state and identity

高度推荐此视频