diff --git a/keystore.rkt b/keystore.rkt index 54952f8..bb3bc88 100644 --- a/keystore.rkt +++ b/keystore.rkt @@ -108,7 +108,9 @@ (define-syntax ks-transaction (syntax-rules () ((_ ks b1 ...) - (begin + (with-handlers ([exn? (λ (e) + (query-exec (keystore-dbh ks) "ROLLBACK") + (raise e))]) (query-exec (keystore-dbh ks) "BEGIN") (let ((r (begin b1 ...))) (query-exec (keystore-dbh ks) "COMMIT") diff --git a/scrbl/keystore.scrbl b/scrbl/keystore.scrbl index 3c36bbb..23e1baf 100644 --- a/scrbl/keystore.scrbl +++ b/scrbl/keystore.scrbl @@ -121,6 +121,14 @@ Returns raw key-value rows in the form: ] } + +@defform[(ks-transaction [ks keystore?] b1 ...)]{ + +Puts b1 ... in a "BEGIN/COMMIT" transaction. +It uses with-handlers exn?, so if you raise an exception, +it will do a "BEGIN/ROLLBACK" abd re-raise the exception. +} + @section{Examples} @subsection{Basic Usage}