繁体   English   中英

一起使用STM和数据库事务

[英]Using STM and Database transactions together

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

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

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

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

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

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

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

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

do r <- atomically $ do ...
   r' <- r

要么

do r <- join . atomically $ do ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM