Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 同时使用STM和数据库事务_Database_Haskell_Stm - Fatal编程技术网

Database 同时使用STM和数据库事务

Database 同时使用STM和数据库事务,database,haskell,stm,Database,Haskell,Stm,我一直在使用Haskell的STM库,我真的很喜欢编写事务的能力和STM的一般“你不能搞错”性质 出于充分的理由,STM不允许在事务中执行IO操作。无法重试IO操作。(此处插入发射导弹参考)。另一方面,数据库事务确实有一些非常相似的原子性保证。是否有一种公认的方法将两者结合使用 将不同种类的事务交错到一个事务概念中被称为“事务增强”,Haskell的STM目前没有一个很好的方法来实现这一点。但是,有一种方法可以建立仅在提交或重试时执行的操作: 此外,您可以尝试twilight stm项目,该项目

我一直在使用Haskell的STM库,我真的很喜欢编写事务的能力和STM的一般“你不能搞错”性质


出于充分的理由,STM不允许在事务中执行IO操作。无法重试IO操作。(此处插入发射导弹参考)。另一方面,数据库事务确实有一些非常相似的原子性保证。是否有一种公认的方法将两者结合使用

将不同种类的事务交错到一个事务概念中被称为“事务增强”,Haskell的STM目前没有一个很好的方法来实现这一点。但是,有一种方法可以建立仅在提交或重试时执行的操作:

此外,您可以尝试twilight stm项目,该项目在事务结束和实际提交之间提供了一个明确的“twilight”。据我所知,提供的代码更多的是一个参考实现,而不是一个性能优化的实现,但是:


尽管如此,根据您的应用程序的不同,它对于您的目的来说可能非常快。

一些不太熟悉数据库的人提供的一般帮助:

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

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

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

Dor自从你问了将近9年,STM不用于实现DBMS及其应用程序是多么浪费。你以后一直遇到过吗?
do r <- join . atomically $ do ...