10

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

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

如果 A 同时发生了变化,是否有可能使该事务失败?

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

4

1 回答 1

4

我没有使用过persistent自己,但是Yesod 书中提到

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

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

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

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

于 2013-05-02T14:41:33.880 回答