Persistent: Как получить я в ACID

Предположим, что я выполняю следующие шаги в транзакции:

  • прочитайте некоторые данные A из базы данных
  • выполните некоторые вычисления на основе этого
  • напишите некоторые данные B в базу данных

Возможно ли сделать эту транзакцию неудачной, если A изменилось в среднем?

Вкратце: как добиться изоляции в постоянном пакете?

Ответ 1

Я сам не использовал persistent, но Yesod book упоминает, что

Важно отметить, что все, что происходит внутри один вызов runSqlConn выполняется в одной транзакции. У этого есть два важные последствия:

  • Для многих баз данных, совершающих транзакцию может быть дорогостоящей деятельностью. Помещая несколько шагов в один транзакции, вы можете значительно ускорить код.

  • Если исключение брошенный где-нибудь внутри одного вызова runSqlConn, все действия будут (при условии, что у вашего backend есть поддержка отката).

Независимо от того, дает ли это вам гарантии изоляции, возможно, зависит от того, предоставляет ли данный сервер гарантии изоляции для транзакций.