在Clojure中,我们使用STM进行并发处理。
我的问题是,STM使用数据的时间点值,这是否会引入歧义?
我们如何知道所访问的值?
我的问题是,STM使用数据的时间点值,这是否会引入歧义?
我们如何知道所访问的值?
在Clojure中,通过ref
和dosync
提供STM事务上下文,从外部世界的视角来看,所有更新都保证在所有涉及到的ref上“同时”进行。
其目标是维护系统中值的一致性,典型示例是在两个银行账户之间转移资金。如果您要从A账户向B账户转移100美元,则希望同时更改A和B的金额。
在此示例中,在事务内处理的金额的读取值实际上没有歧义,因为在执行从事务外部进行读取时,只有以下情况是可能发生的:
在事务内部,你只读(不修改)的ref
的值可能会从事务的某个点到另一个点发生改变,这被称为写入偏斜(见Clojure Programming - 第4章,Refs,Write Skew)。为了避免这种情况,你可以使用ensure
(而不是deref
),这将导致如果这些ref
的任何一个值发生更改(你只读的那些),则整个事务将重新尝试。