Yesod持久原子相互作用

FtheBuilder

我完全错过了数据库打开连接和回滚功能的要点,所以runDB myAction每次都在使用,因为我不知道发生了什么。今天,我进行了一些测试以试图了解它是如何进行回滚的,其中之一是:

getTestR :: Handler Text
getTestR = do
 runDB $ insert $ Test 0
 runDB $ do
   forM_ [1..] $ \n -> do 
     if n < 10
       then do
         insert $ Test n
         return ()
       else undefined
 return "completed"

undefined在运行时遇到了一个错误,正如预期的那样,只有第一个runDB操作进入了数据库,第二个runDB被回滚,当我插入另一个注册表时,其ID从最后一个持久元素前面的9个位置开始。

假设我必须get在数据库中执行2项操作,并且以两种方式执行它们,第一种是:

getTestR :: FooId -> BooId-> Handler Text
getTestR fooid booid = do
  mfoo <- runDB $ get fooid
  mboo <- runDB $ get booid
  return "completed"

然后我尝试:

getTest'R :: FooId -> BooId-> Handler Text
getTest'R fooid booid = do
  (mfoo, mboo) <- runDB $ do
     mfoo <- get fooid
     mboo <- get booid
     return (mfoo,mboo)
  return "completed"

实际的总体差异是多少?我认为在这种情况下,数据库一致性不是问题,但是性能可能是(或者Haskell惰性会使它们相等,因为mfoo并且mboo从未使用过,因此也不会查询它们)。这些问题可能看起来很废话,但是我想确保我的理解没有空白。

Yogesh sajanikar

我认为您在讨论两个数据库操作时已经回答了自己的问题。“ runDB”具有以下签名。

runDB :: YesodDB site a -> HandlerT site IO a

YesodDB是ReaderT变压器monad。runDb将DB操作提升为IO操作。在第一个示例中,有两个单独的IO操作(不是DB操作)。在第二个片段中,只有一个数据库操作。在第一个示例中,一个或两个动作都可能成功。但是在第二个中,您将得到2 gets的结果或一个错误。

由于有两个IO包裹两个runDBs的动作,因此无法优化数据库交互,因为每个runDB代表一个动作。然而,第二步,这两个动作将共享相同的连接。

您可能需要查看YesodPersistentBackend并使用getDBRunner来共享来自池的连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

球拍类和线程相互作用

来自分类Dev

Mithril和jQuery如何相互作用?

来自分类Dev

在图形中揭示相互作用的簇

来自分类Dev

如何创建相互作用的稀疏矩阵?

来自分类Dev

懒惰评估与MVars如何相互作用?

来自分类Dev

地层相互作用变量基准年

来自分类Dev

flury是否与asynctaks相互作用?

来自分类Dev

相互作用序列分析软件?

来自分类Dev

<form>和.ajax()之间的相互作用

来自分类Dev

在图形中揭示相互作用的簇

来自分类Dev

具有相互作用的三因素逻辑回归

来自分类Dev

窗口函数和group by子句如何相互作用?

来自分类Dev

数据表中因素之间的相互作用

来自分类Dev

Aurelia自定义元素如何相互作用?

来自分类Dev

硒相互作用:您的连接不是私有的

来自分类Dev

找出两个方程的相互作用

来自分类Dev

在R中报告线性模型中的相互作用

来自分类Dev

如何提取β系数以实现R中的相互作用?

来自分类Dev

如何提取β系数以实现R中的相互作用?

来自分类Dev

2种形式的成分之间的相互作用

来自分类Dev

Web Service检索毒品相互作用?

来自分类Dev

了解功能如何相互作用。我如何退出?

来自分类Dev

2种形式之间的相互作用(隐藏/显示)

来自分类Dev

窗口函数和group by子句如何相互作用?

来自分类Dev

来自不同层的节点是否会相互作用

来自分类Dev

r 中相互作用的分类变量的奇异性

来自分类Dev

Yesod持久代码的Typeclass约束

来自分类Dev

仅使用R中某个因子水平的子集对相互作用进行建模

来自分类Dev

蛋白质相互作用数据集和MLN脚本说明