Ich habe den Punkt der Datenbank geöffnet Verbindung und Rollback-Funktion vollständig vermisst, so dass ich runDB myAction
jedes Mal verwendet wurde, weil ich nicht wusste, was los war. Heute habe ich einige Tests zu versuchen zu verstehen, wie es das Rollback der Fall ist, und einer von ihnen war:Yesod Persistente atomare Interaktion
getTestR :: Handler Text
getTestR = do
runDB $ insert $ Test 0
runDB $ do
forM_ [1..] $ \n -> do
if n < 10
then do
insert $ Test n
return()
else undefined
return "completed"
Ich habe eine undefined
Fehler zur Laufzeit, wie erwartet, und nur die erste runDB
Aktion bekam in der Datenbank , die zweite runDB
wurde zurückgerollt und als ich eine andere Registrierung einfügte, begann seine ID mit 9 Positionen vor dem letzten beibehaltenen Element.
Angenommen, ich habe 2 get
s Aktionen in der Datenbank zu tun, und ich tun, um sie auf zwei Arten, zuerst ich tun:
getTestR :: FooId -> BooId-> Handler Text
getTestR fooid booid = do
mfoo <- runDB $ get fooid
mboo <- runDB $ get booid
return "completed"
und dann versuche ich:
getTest'R :: FooId -> BooId-> Handler Text
getTest'R fooid booid = do
(mfoo, mboo) <- runDB $ do
mfoo <- get fooid
mboo <- get booid
return (mfoo,mboo)
return "completed"
Welche würden der tatsächliche Gesamtunterschied sein? Ich denke, dass in diesem Fall die Datenbankkonsistenz kein Problem ist, aber die Performance kann sein (oder wird Haskell Faulheit sie gleich machen, weil mfoo
und mboo
niemals verwendet werden, so dass sie nie abgefragt werden?). Wahrscheinlich sehen diese Fragen sehr unsinnig aus, aber ich möchte sicher sein, dass ich keine Lücken in meinem Verständnis habe.
Haskell ist sehr groß, ich denke, dass der Verstand eines Programmierers, der Haskell während einer ziemlich guten Zeit aussetzt, sich niemals in seinen ursprünglichen Zustand zurückversetzt. Es ist wie Programmierung mit erhöhter Leistung, die ständig Verbesserungen in unseren eigenen Köpfen und folglich in unserer allgemeinen Kodierung macht. – FtheBuilder