确定性函数的术语没有副作用?

时间:2009-04-02 17:14:01

标签: function computer-science idempotent

我需要适用于特定类型功能的术语。

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

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

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

函数的参数是可以的,因为它们基本上用作常量。

这种类型的功能适当的术语是什么? “确定性”似乎并不具体。你会如何描述这类功能?


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

  • 纯函数没有副作用,其结果仅基于其参数。给出相同参数的结果总是相同的。这不起作用,因为我想到的数据库函数可以基于数据的状态,并且该函数也可以影响数据的状态。

  • 幂等函数可以根据数据状态返回结果,并且给定相同的数据状态,结果始终相同。但这对我的想法并不适用;无论调用函数多少次,幂等函数的效果都必须导致不变的结果。但是,在事务隔离中进行的更改与在该范围外部进行的更改之间没有区别。

4 个答案:

答案 0 :(得分:6)

您也可以调用这些pure functions

答案 1 :(得分:5)

您是在询问idempotent吗?

答案 2 :(得分:1)

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

  

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

我不太确定。您的意思是它可以在交易中进行更改但在未来的电话中不会认识到它们吗?你如何用以下方式解决这个问题:

  

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

换句话说,您是否将交易中的副作用限制为分配(例如将标志设置为true),如果多次执行则具有相同的效果?

答案 3 :(得分:1)

这里有两个不同的概念,所以你可能需要结合多个术语,原因相同,没有一个形容词可以描述" red circular house"。

  

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

     

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

只有"数据库范围"和"会话范围"。函数没有"事务范围"的概念。函数可以在事务中使用,也可以在 事务之外使用,但从函数的角度来看,没有区别。

在一个功能的眼中,"交易范围" 完全"数据库范围"。未提交的事务中的事情不应该被提交,并且因为这适用于所有事务,所以没有什么特别的:

  

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

因为它描述的是交易,而不是功能。我们可以放心地忽略与" transactions"。

有关的任何描述
  

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

     

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

     

>如果函数在数据库中更改了数据,那么就好了,因为如果调用事务被回滚,那么函数的效果也是

     

>但是 transaction [数据库]隔离中的更改与该范围外部的更改之间没有区别。

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

  

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

这意味着副作用。

  

>我想到的数据库函数可以基于数据的状态,而且函数也可以影响数据的状态。

最接近的术语是"非nullipotent"或"可能有状态"

所以结论是" db-local non-nullipotent function"。