Терминология для детерминированной функции без побочных эффектов?
Мне нужна правильная терминология для определенного типа функции.
Предположим, вы пишете функцию в своей базе данных SQL, чьи входы и выходы содержатся в рамках транзакции базы данных.
То есть, если вы вызываете эту функцию в области транзакции базы данных, все данные, используемые функцией, будут доступны в той же области. Он может запросить таблицу базы данных, но не может прочитать файл из файловой системы или пропинговать веб-сайт и т. Д. Если вы вызываете функцию дважды в одной транзакции с REPEATABLE READ
В изоляции вы должны получить тот же результат, даже если другие клиенты вносят изменения в базу данных.
Аналогично, функция не имеет побочных эффектов, за исключением той же области транзакции. Изменения в состоянии вне области транзакции базы данных не допускаются. Функция не должна ни отправлять электронные письма, ни записывать в файловую систему, ни сохранять значения в memcached
и т. д. Если функция изменяет данные в базе данных, это нормально, потому что, если вызывающая транзакция откатывается, это также влияет на функцию.
Аргументы функции в порядке, так как они в основном используются в качестве констант.
Каков был бы правильный термин для функции этого типа? "Детерминизм" не кажется достаточно конкретным. Как бы вы описали этот класс функций?
Спасибо за ваши ответы, но ни один из них не является тем, что я имел в виду. Идемпотент становится ближе всего, поэтому я отметил это как принятый ответ. Но каждый из вас получил от меня отклик независимо.
Чистые функции не имеют побочных эффектов, и их результат основан исключительно на их аргументах. Результат с одинаковыми аргументами всегда идентичен. Это не работает, потому что функции базы данных, которые я имею в виду, могут основываться на состоянии данных, а функция также может влиять на состояние данных.
Идемпотентные функции могут возвращать результат, основанный на состоянии данных, и при одинаковом состоянии данных результат всегда идентичен. Но это не работает для того, что я имею в виду; Эффекты идемпотентных функций должны приводить к неизменному результату, независимо от того, сколько раз вызывается функция. Но нет никаких различий между изменениями, сделанными в изоляции транзакций, и изменениями, сделанными вне этой области.
4 ответа
До четвертого абзаца я думал, что это просто чистая функция с транзакцией в качестве неявного аргумента. Но когда вы говорите:
функция не имеет побочных эффектов, за исключением той же области действия транзакции. Изменения в состоянии вне области транзакции базы данных не допускаются.
Я не уверен. Вы имеете в виду, что он может вносить изменения в транзакцию, но не знать о них при будущих звонках? Как вы согласуете это с:
Если вы вызываете функцию дважды в одной транзакции с изоляцией REPEATABLE READ, вы должны получить тот же результат
Другими словами, ограничиваете ли вы побочные эффекты в транзакциях назначениями (такими как установка флага в значение true), которые имеют одинаковый эффект, если они выполняются несколько раз?
Здесь есть два разных понятия, поэтому вам может потребоваться объединить несколько терминов по одной и той же причине, потому что нет единственного прилагательного для описания "красного круглого дома".
> Изменения в состоянии вне области транзакции базы данных не допускаются.
> Если функция изменяет данные в базе данных, это нормально, потому что, если вызывающая транзакция откатывается, то эффект функции тоже.
Существует только "область действия базы данных" и "область действия сеанса". Функция не имеет понятия "объем транзакции". Функция может использоваться внутри транзакции или за ее пределами, но с точки зрения функции не будет никакой разницы.
С точки зрения функции, "область транзакции" является именно"областью действия базы данных". Вещи в незафиксированной транзакции не должны быть зафиксированы, и поскольку это относится ко всем транзакциям, в этом нет ничего особенного:
Если вы вызываете функцию дважды в одной транзакции с изоляцией REPEATABLE READ, вы должны получить тот же результат, даже если другие клиенты вносят изменения в базу данных.
потому что это описывает транзакцию, а не функцию. Мы можем смело игнорировать любое описание, относящееся к "транзакциям".
> Он может запросить таблицу базы данных, но не может прочитать файл из файловой системы или пропинговать веб-сайт и т. Д.
> Изменения в состоянии вне области
транзакциибазы данных не допускаются. Функция не должна ни отправлять электронные письма, ни записывать в файловую систему, ни сохранять значения вmemcached
, так далее.> Если функция изменяет данные в базе данных, это нормально,
потому что, если вызывающая транзакция откатывается, то эффект функции тоже.> Но нет никаких различий между изменениями, сделанными в изоляции
транзакции[базы данных], и изменениями, внесенными вне этой области.
Ближайшим термином, вероятно, будет "база данных локальная".
> Аналогично, функция не имеет побочных эффектов,кроме как в пределах одной
транзакции[база данных].
Что означает, чтоу него есть побочные эффекты.
> Функции базы данных, которые я имею в виду, могут основываться на состоянии данных, и функция также может влиять на состояние данных.
Ближайший термин "ненулевой" или "возможно, с состоянием".
Таким образом, вывод "ДБ-локальная ненуллипотентная функция".