Clojure STM和Haskell STM有什么不同之处?

31

我试图找出Clojure所称的STM与Haskell中实现的STM之间的区别。撇开实际语言语义的差异,我有点困惑,因为Rich Hickey在他的演讲中说Clojure的STM实现与其他任何东西都非常不同,但我除了语言选择以外不理解这些差异。

3个回答

25

Clojure STM有三个独特的特点:

  1. 实现了MVCC快照避免事务在读取无效数据时重启。
  2. 确保读写引用提供对资源获取顺序的一种手动控制。
  3. 具有显式的commute操作,可以减少交错写入的重试次数。

3
你能否在这个列表中添加非事务性读取不增加额外开销的内容? - mikera
没错,当你使用非事务性上下文时是这样的,但如果你考虑到STM和其他事务的重试,我不确定整个系统是否会因为上下文切换而受到性能影响。但JVM非常成熟,STM就像GC一样...非常必要,所以你应该从这方面考虑。 - william gouvea
1
嗨,William。阅读Mark Volkmann的文章和演示文稿,他说:“当Ref的历史记录列表不包含在事务开始之前提交的值时,Clojure中的读取操作会触发重试”。上述描述的第一个特性是正确的吗? - CHAPa
@CHAPa 正确,"减少"是比"避免"更好的词。但通常只有在特殊情况下(读取速度慢且频繁写入速度快)才会出现这种情况。 - Dax Fohl
Clojure的STM存在一个广为人知但未解决的特定问题,即如果长时间运行的事务被较短的事务抢占,则可能永远无法完成。我不确定Haskell是否有类似的问题。 - johnbakers

16

有关Haskell STM,请参阅SPJ的论文:http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/

"可组合的内存事务"和"带数据不变量的事务性内存"特别有用。 GHC实现的STM确实不是MVCC。 我记不清所有的实现细节,但我的理解是论文中的描述与目前在GHC中存在的描述并没有太大不同。

(请注意,MVCC在Clojure或其他地方都可以实现写入偏斜——例如,请参见此处:http://en.wikipedia.org/wiki/Snapshot_isolation


8
值得注意的是,GHC的实现在编译时提供了有关交易安全性方面的保证,以及独特的 orElse 组合器用于原子地组合交易。 - Don Stewart
@DonStewart 此外,Haskell的STM是一个MonadPlus,它允许您在事务上下文中指定额外的失败条件。例如,如果最终账户余额为负,则失败/重试该事务。它还允许您轻松地与其他MonadPlus类共享该逻辑;给定一组帐户和购买,相同的函数将显示所有潜在有效交易的结果。如果逻辑复杂,这可能很有用。我认为Clojure都不可能实现这两个功能。 - Dax Fohl

12

Mark Volkmann在Strange Loop 2009上详细介绍了STM的一般概念(以及Clojure的STM),您可以在这里找到该演示文稿(文章和幻灯片在此处)。除了代码之外,我不知道还有哪些其他资源可以帮助理解Clojure的STM工作方式。


演示链接无法使用。有人有这个讲座的替代方案吗? - Neil
1
这个主题的演示幻灯片和详细文章可以在这里找到:http://java.ociweb.com/mark/stm/article.html - lorefnon
1
这是一篇非常好的文章,易于理解。Volkmann先生是一位才华横溢的作家。 - Alex
是否有 Volkmann 先生演讲的录音可用? - Louis Thibault

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