4

对于特定类型的功能,我需要适当的术语。

假设您在 SQL 数据库中编写了一个函数,其输入和输出包含在数据库事务的范围内。

也就是说,如果您在数据库事务的范围内调用此函数,则该函数使用的所有数据在同一范围内都是可用的。它可以查询数据库表,但不能从文件系统读取文件,或 ping 网站等。如果您在单个事务中REPEATABLE READ隔离调用该函数两次,您应该得到相同的结果,即使其他客户端正在对数据库进行更改。

同样,该函数没有副作用,除非在相同的事务范围内。不允许在数据库事务范围之外更改状态。该函数不应该发送电子邮件,也不应该写入文件系统,也不应该在 中存储值memcached等。如果该函数更改数据库中的数据,那没关系,因为如果调用事务回滚,那么该函数的效果也是如此.

函数的参数没问题,因为它们基本上用作常量。

这种类型的功能的正确术语是什么?“确定性”似乎还不够具体。您如何描述此类功能?


感谢您的回答,但它们都不是我的想法。幂等最接近,所以我将其标记为已接受的答案。但是无论如何,你们每个人都得到了我的支持。

  • 纯函数没有副作用,它们的结果完全基于它们的参数。给定相同参数的结果总是相同的。这不行,因为我想到的数据库函数可以基于数据的状态,函数也可以影响数据的状态。

  • 幂等函数可以根据数据的状态返回一个结果,并且给定相同的数据状态,结果总是相同的。但这并不完全符合我的想法。无论调用多少次,幂等函数的效果都必须导致结果不变。但是在事务隔离内所做的更改和在该范围之外所做的更改之间没有区别。

4

4 回答 4

6

您也可以调用这些纯函数

于 2009-04-02T17:22:04.917 回答
5

你在问幂等吗?

于 2009-04-02T17:20:23.517 回答
1

直到第四段,我认为它只是一个纯函数,事务作为隐式参数。但是当你说:

该函数没有副作用,除非在相同的事务范围内。不允许在数据库事务范围之外更改状态。

我不确定。您的意思是它可以交易中进行更改,但在未来的通话中无法识别它们吗?你如何把它与:

如果在单个事务中使用 REPEATABLE READ 隔离调用该函数两次,则应该得到相同的结果

换句话说,您是否将事务中的副作用限制为多次执行时具有相同效果的赋值(例如将标志设置为 true)?

于 2009-04-02T17:21:20.517 回答
1

这里有两个不同的概念,因此您可能需要组合多个术语,原因相同,没有一个形容词可以描述“红色圆形房屋”。

> 不允许在数据库事务范围之外更改状态。

> 如果函数改变了数据库中的数据,那没关系,因为如果调用事务被回滚,那么函数的效果也是如此。

只有“数据库范围”和“会话范围”。函数没有“事务范围”的概念。函数可以在事务内部或事务外部使用但从函数的角度来看没有区别。

在函数的眼中,“事务范围”就是数据库范围”。未提交事务中的事物不应该被提交,并且由于这适用于所有事务,因此没有什么特别之处:

如果您在具有 REPEATABLE READ 隔离的单个事务中调用该函数两次,您应该得到相同的结果,即使其他客户端正在数据库中进行更改。

因为那是描述交易,而不是功能。我们可以放心地忽略任何与“交易”有关的描述。

> 它可以查询数据库表,但它不能从文件系统中读取文件,或 ping 网站等。

>不允许在数据库事务范围之外更改状态。该函数不应发送电子邮件,也不应写入文件系统,也不应在 中存储值memcached等。

> 如果函数改变了数据库中的数据,那没关系,因为如果调用事务被回滚,那么函数的效果也是如此

> 但是在事务[数据库] 隔离内所做的更改和在该范围之外所做的更改之间没有区别。

最接近的术语可能是“本地数据库”。

> 同样,该函数没有副作用,除非在同一事务[数据库] 范围内。

这意味着它副作用。

> 我心目中的数据库函数可以基于数据的状态,函数也可以影响数据的状态。

最接近的术语是 "non-nullipotent" 或"possibly-stateful"

所以结论是“A db-local non-nullipotent function”。

于 2015-03-11T00:52:52.767 回答