Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure STM模糊因子_Clojure_Stm - Fatal编程技术网

Clojure STM模糊因子

Clojure STM模糊因子,clojure,stm,Clojure,Stm,在Clojure中,我们使用STM进行并发 我的问题是STM使用数据的时间点值,这不是引入了歧义吗 我们怎么知道访问了什么价值呢?Clojurians使用“时间”和“价值”这两个词,在这个上下文中有非常具体的含义,以消除这种歧义。在这种情况下,“时间”是“序列中的时间”或划时代的时间,而不是墙上的时间。所以时间描述了这个标识的值序列中的哪个值 值是某个时间点上标识的不变内容。该值可以是简单值(原始值或原子值)或复合值,并由任意结构的不变值组成。重要的一点是,值不会更改,因此如果您想知道使用了哪个

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

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


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

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

值是某个时间点上标识的不变内容。该值可以是简单值(原始值或原子值)或复合值,并由任意结构的不变值组成。重要的一点是,值不会更改,因此如果您想知道使用了哪个值,只需打印或记录即可


我非常推荐这段视频,因为Clojure中的STM(通过和)提供了一个事务上下文,当从外部世界观看时,所有更新都保证“同时”进行给所有相关的参考

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

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

  • 事务已开始但尚未完成,因此值尚未“正式”更改。稍后可以提交或重试事务,但当您读取它们时,这就是每个帐户的状态
  • 交易已完成,因此读取的金额为修改后的值
  • 在事务内部时,仅读取(不修改)的
    ref
    s可以将其值从事务的一个点更改为另一个点,这称为写入偏移(请参阅-第4章,Refs,写入偏移)。为了避免这种情况,您可以使用(而不是),这将导致如果这些
    ref
    s中任何一个的值发生更改(您仅读取的值),则将重试整个事务