一起使用STM和数据库事务

Joh*_*ler 13 database haskell stm

我一直在使用Haskell的STM库,我非常喜欢编写事务的能力以及STM的一般"你不能得到这个错误"的特性.

有充分理由,STM不允许在事务中执行IO操作.无法重试IO操作.(在这里插入发射导弹参考).另一方面,数据库事务确实有一些非常相似的原子性保证.有没有可以接受的方式将两者结合使用?

scl*_*clv 11

将不同类型的事务交织到单个事务概念中称为"事务性提升",目前在Haskell的STM中没有很好的方法.但是,有一种方法可以构建仅在提交时执行或仅在重试时执行的操作:http://hackage.haskell.org/package/stm-io-hooks

此外,您可以尝试使用twilight-stm项目,该项目在事务结束和实际提交之间提供明确的"黄昏".据我所知,提供的代码更多的是参考实现而不是针对性能调整的实现,但是:http://proglang.informatik.uni-freiburg.de/projects/twilight/

尽管如此,根据您的应用程序,它可能会变得非常快,适合您的目的.


alt*_*ive 5

一些没有处理过数据库的人的一般帮助:

你可以在技术上使用unsafeIOToSTM,所以如果你通过修改数据库的IO动作保证原子性,它应该没问题.只需编写一个桥接器,unsafeIOToSTM 在您的代码中使用然后使用该桥接器,以避免使用不安全的东西来缓解您的代码.

您也可以使用STM(IO a)但这并不总是适合您的目的,例如

do r <- atomically $ do ...
   r' <- r
Run Code Online (Sandbox Code Playgroud)

要么

do r <- join . atomically $ do ...
Run Code Online (Sandbox Code Playgroud)

返回数据库查询以从STM执行的位置.这是安全的,但更有限,因为你使用mVar做的事情并不能从你返回的IO动作中进行修改(这对于安全性是一件好事,因为它保持了原子性)