(defmacro in-txn ((txn &key no-sync sync do-commit) &body body)
(with-gensyms (success return)
(once-only (txn do-commit)
`(let ((,return nil)
(,success nil))
(unwind-protect
(progn
(setq ,return (multiple-value-list
(progn
,@body)))
(when ,do-commit
(db-txn-commit ,txn
:no-sync ,no-sync
:sync ,sync))
(setq ,success t)
(apply #'values ,return))
(if (and ,do-commit
(not ,success))
(db-txn-abort ,txn)))))))Source Context