Clojure中的STM提供(通过refs和dosync)一个事务上下文,其中所有更新都保证"同时"发生在从外部世界查看时涉及的所有引用.
目标是保持系统中价值的一致性,典型的例子是两个银行账户之间的资金转移.如果您从账户A转账到账户B的100美元,那么您将希望同时更改A和B的金额.
在这个例子中,对于在事务中处理的金额读取的值实际上没有歧义,因为在完成事务外部的读取时,只有以下情况是可能的:
当在事务内部时,ref您只读取(并且不修改)的s 可以将它们的值从事务的一个点更改为另一个点,这称为写入偏斜(参见Clojure Programming - 第4章,参考,写入偏斜).为了避免这种情况,您可以使用ensure(而不是deref),这将导致如果这些中ref的任何一个的值发生更改(您只读取的那些),那么将重试整个事务.