2011-11-19 3 views
13

Utilizzo la libreria STM di Haskell e mi piace molto la capacità di comporre transazioni e la natura generale "non si può-sbagliare" di STM.Utilizzo di transazioni STM e database insieme

Per una buona ragione, STM non consente azioni IO all'interno di una transazione. Non c'è modo di riprovare un'azione IO. (inserisci qui il riferimento ai missili di lancio). Le transazioni di database, d'altra parte, hanno alcune garanzie di atomicità che sono molto simili. C'è un modo accettato di usare i due insieme?

risposta

11

L'interconnessione di diversi tipi di transazioni in una singola nozione di transazione è denominata "potenziamento della transazione" e non esiste un ottimo modo per farlo in STM di Haskell al momento. Esiste, tuttavia, un modo per creare azioni da eseguire solo su commit o solo su tentativi: http://hackage.haskell.org/package/stm-io-hooks

Inoltre, è possibile provare il progetto twilight-stm, che fornisce un "twilight" esplicito tra le transazioni che terminano e impegno reale. Per quanto ne so, il codice fornito è più un'implementazione di riferimento rispetto a uno sintonizzato per le prestazioni, tuttavia: http://proglang.informatik.uni-freiburg.de/projects/twilight/

Tuttavia, a seconda dell'applicazione, potrebbe risultare molto veloce per i propri scopi.

5

Alcune informazioni di carattere generale da qualcuno che non ha affrontato con i database molto:

È possibile utilizzare tecnicamente unsafeIOToSTM, quindi se si sono garantiti atomicity dall'azione IO, che modifica il database, dovrebbe andare bene. Basta scrivere un bridge che utilizza unsafeIOToSTM e quindi utilizzare quel bridge nel codice per evitare di leggere il codice con cose non sicure.

È inoltre possibile utilizzare uno STM (IO a), ma questo non sempre soddisfare il vostro scopo, come

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

o

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

Dove ritorni la query di database per eseguire da STM . Questo è sicuro ma molto più limitato in quanto ciò che si fa con mVar e tale non può essere modificato dall'interno dell'azione IO restituita (che è una buona cosa per quanto riguarda la sicurezza in quanto mantiene l'atomicità)