2011-11-19 19 views
13

Używam biblioteki STM firmy Haskell i bardzo podoba mi się możliwość komponowania transakcji i ogólne "nie-możesz-dostać-to-złe" właściwości STM.Używanie transakcji STM i bazy danych

Nie bez powodu STM nie zezwala na działania IO w ramach transakcji. Nie ma możliwości powtórzenia operacji we/wy. (wstaw tutaj odnośnik do rakiet). Z drugiej strony transakcje bazy danych mają pewne gwarancje atomowości, które są bardzo podobne. Czy istnieje akceptowany sposób wykorzystania tych dwóch elementów razem?

Odpowiedz

11

Przeplatanie różnych rodzajów transakcji w pojęcie pojedynczej transakcji nazywa się "wzmocnieniem transakcyjnym" i nie ma w tej chwili świetnego sposobu, aby to zrobić w STM firmy Haskell. Istnieje jednak sposób na budowanie akcji, które będą wykonywane tylko po zatwierdzeniu lub tylko przy próbie ponowienia: http://hackage.haskell.org/package/stm-io-hooks

Dodatkowo możesz wypróbować projekt twilight-stm, który zapewnia wyraźny "zmierzch" między kończącymi się transakcjami i rzeczywiste zatwierdzenie. O ile mi wiadomo, dostarczony kod jest bardziej implementacją referencyjną niż dostrojony do wydajności, jednak: http://proglang.informatik.uni-freiburg.de/projects/twilight/

Mimo to, w zależności od aplikacji, może okazać się bardzo szybki do twoich celów.

5

Część ogólna pomoc od kogoś, kto nie ma do czynienia z bazami danych: wiele

Można technicznie wykorzystać unsafeIOToSTM, więc jeśli są gwarantowane niepodzielność przez działanie IO który modyfikuje bazę danych, powinno być w porządku. Po prostu napisz most, który używa unsafeIOToSTM, a następnie użyj tego mostka w kodzie, aby uniknąć literowania kodu z niebezpiecznymi rzeczami.

Można również użyć STM (IO a), ale to nie zawsze dopasować swój cel, jak

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

lub

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

Gdzie zwrócić zapytanie do bazy danych, aby wykonać z STM . Jest to bezpieczne, ale o wiele bardziej ograniczone, ponieważ to, co robisz z mVar's i nie można tego zmienić w ramach działania IO, które zwrócisz (co jest dobre ze względu na bezpieczeństwo, ponieważ utrzymuje atomowość)

Powiązane problemy