持久性:如何让我进入ACID

Tob*_*ndt 10 haskell persistent yesod

假设我在事务中执行以下步骤:

  • 从数据库中读取一些数据A.
  • 根据它做一些计算
  • 将一些数据B写入数据库

如果A在平均时间内发生变化,是否有可能使此交易失败?

简而言之:如何在持久化包中实现隔离?

sha*_*ang 4

我自己没用过persistent,但是Yesod书中提到了这一点

需要注意的一件重要事情是,单个调用中发生的所有事情都runSqlConn在单个事务中运行。这有两个重要的含义:

  • 对于许多数据库来说,提交事务可能是一项成本高昂的活动。通过将多个步骤放入单个事务中,您可以显着加快代码速度。

  • 如果在单个调用中的任何位置抛出异常runSqlConn,则所有操作都将回滚(假设您的后端具有回滚支持)。

这是否为您提供隔离保证可能取决于给定的后端是否为事务提供隔离保证。