定义幂等性

12

“幂等性”可以被定义为:

一种操作,如果执行N次,其效果与仅执行一次相同。

明白了,很简单。

我的问题是关于这个定义的微妙之处 - 一个操作本身是否被认为是幂等的,还是必须考虑传递到操作中的数据?

让我举个例子来澄清:

假设我有一个PUT方法来更新某些资源,我们称之为f(x)

显然,只要我提供3作为输入,f(3)就是幂等的。同样明显的是,f(5)会更改资源的值(即,它不再是3或先前存在的任何值)

因此,当我们谈论幂等性时,我们是在引用操作/函数的泛化(即,f(x)),还是在引用操作/函数+传递给它的数据(即,f(3))?


1
这个是否不应该移动到数学论坛?(为了明确起见:我没有投反对票) - Roy Dictus
这取决于我们是在谈论形式逻辑中的定义还是在谈论Web编程中的定义。我猜测那个踩贴的人(不是我)只是认为问题没有表述清楚。 - Ernest Friedman-Hill
1
@Roy - 我不这么认为,因为它直接适用于RESTful Web服务,而这也是我在示例中编写的上下文。 - Didaxis
我认为在这里讨论是合理的,因为在这里有明确的计算机科学应用,可以在页面中部找到:http://en.wikipedia.org/wiki/Idempotence - Jonathan M
以下是有关编程的内容,从英语翻译成中文。仅返回翻译后的文本:这可能对想要理解概念的人有用:http://pedrorijo.com/blog/fp-concepts/ - pedrorijo91
4个回答

6
假设我有一个PUT方法来更新某个资源,我们称之为f(x)。
显然,只要我提供3作为输入,f(3)就是幂等的。同样明显的是,f(5)将更改资源的值(即它将不再是3或以前存在的任何值)。
只有在服务器实现PUT遵守这种幂等属性时,才会出现这种情况。在HTTP上下文中,RFC 2616说:
方法还可以具有“幂等性”属性,即(除了错误或过期问题之外),N > 0个相同请求的副作用与单个请求的副作用相同。

有点偏题了...在像Web这样的分布式系统中,您可能还需要考虑交换律和并发请求。例如,同一PUT(x1)请求的N+1个副本应该具有相同的效果,但是您不知道另一个客户端是否在您之间进行了不同的PUT(x2)请求,因此尽管nPUT(x1)= PUT(x1)且mPUT(x2)= PUT(x2),但这两组请求可能会交错。


因此,我们可以得出结论,在这个例子中,PUT在单个请求的上下文中是幂等的。但即使它与其他并发请求交错时,由于第一个操作的结果遵循了幂等性属性,它仍然是幂等的,不是吗? - Amit Dash

5

幂等性要求操作在其域上的所有值都成立,即对于所有 xf(f(x)) = f(x)。另一种思考方式是,如果将操作与自身组合后得到的仍是该操作,则该操作是幂等的。


@JonathanM 抱歉,我不明白你的观点。对于所有实数或复数x,都有abs(abs(x)) = abs(x)。如果您认为abs与我所说的不符,请举出反例。 - Michael J. Barber

3
你假设幂等性意味着服务器状态会在一系列调用中被改变最多一次。大多数情况下,人们使用这个术语是指服务器上的状态不会被任何数量的调用改变。在这种情况下,你两种情况之间的区别是无关紧要的。

3
但是要说明“不会改变”的意思是“无效的”,对吧?这将包括GET、HEAD、OPTIONS和TRACE。 - Didaxis

3

这并不完全是幂等性的定义。如果对于任何项x,函数f(x)的两次应用f(f(x)) == f(x),那么它就是幂等的。

在这里,PUT不是您的f()函数的结果,而是其副作用。


你的定义与此处给出的定义相悖:http://en.wikipedia.org/wiki/Idempotence。该页面首先将`abs()`列为幂等函数,但按照你的定义,它并不是。 - Jonathan M
1
这是完全错误的。您已将幂等性定义为等同于恒等函数。您暗示操作已经对x完成。 - Michael J. Barber
我认为你可以轻松地澄清一下你的回答;特别是将幂等性与PUT操作相关联会很有用。 - Michael J. Barber
如果我理解正确,每个恒等函数都是幂等的,但反过来则不一定成立。 - Amit Dash

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