On 05/17/2017 07:44 PM, Stefan Beller wrote: > On Wed, May 17, 2017 at 5:05 AM, Michael Haggerty <mhagger@xxxxxxxxxxxx> wrote: >> Break the function `ref_transaction_commit()` into two functions, >> `ref_transaction_prepare()` and `ref_transaction_finish()`, with a >> third function, `ref_transaction_abort()`, that can be used to abort >> the transaction. Break up the `ref_store` methods similarly. >> >> This split will make it easier to implement compound reference stores, >> where a transaction might have to span multiple underlying stores. In >> that case, we would first want to "prepare" the sub-transactions in >> each of the reference stores. If any of the "prepare" steps fails, we >> would "abort" all of the sub-transactions. Only if all of the >> "prepare" steps succeed would we "finish" each of them. > [...] Thanks for your comments. While I was incorporating them, I realized that other parts of the documentation needed updates, too. And while I was fixing that, I noticed that the interface was unnecessarily complicated. The old version required either `commit` or `prepare` followed by `finish`. But there is no reason that the public API has to expose `finish`. So instead, let's call `prepare` an optional step that is allowed to precede `commit`, and make `commit` smart enough to call `prepare` if it hasn't been called already, and then call `finish`. Furthermore, let's make it possible to call `abort` when the transaction is in OPEN as well as PREPARED state rather than requiring `free` in OPEN state and `abort` in PREPARED state. I will make these changes and revamp the docs for v2. Michael