Clojure STM歧义因素

nis*_*013 4 clojure stm

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

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

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

jua*_*rro 8

Clojure中的STM提供(通过refs和dosync)一个事务上下文,其中所有更新都保证"同时"发生在从外部世界查看时涉及的所有引用.

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

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

  1. 交易已经开始但尚未完成,因此价值尚未"正式"改变.事务可以在以后提交或重试,但是当您阅读它们时,这就是每个帐户的状态.
  2. 交易已完成,因此读取的金额为修改后的值.

当在事务内部时,ref您只读取(并且不修改)的s 可以将它们的值从事务的一个点更改为另一个点,这称为写入偏斜(参见Clojure Programming - 第4章,参考,写入偏斜).为了避免这种情况,您可以使用ensure(而不是deref),这将导致如果这些中ref的任何一个的值发生更改(您只读取的那些),那么将重试整个事务.