Skip to content

Detecting transaction retries #81

@keijokapp

Description

@keijokapp

I'm in a little bit of an XY problem situation. There's a known limitation in FDB client API, which is unlikely going to be resolved in the foreseeable future. So I need to work around that. If there's a [better] way to solve it, I'd be interested.

Setting version stamped entries makes those entries unreadable. But it is sometimes necessary to access those entries after they have been set. The only way to "access" them is to also store them in some other storage. (I guess I could also use transaction_bypass_unreadable but that seems too hacky to be useful.) Whatever that external storage would be (eg. WeakMap, magic property on some object), it has to be tied to a specific transaction run. When transaction is retried, that storage should reset.

The library doesn't provide a way for abstractions to detect that the transaction has been restarted and it should dispose the external state created by the previous run. Nor does it provide a way to identify the underlying transaction without using internal _tn or _ctx properties.

My proposal is to use Transaction#_ctx for this. It is already used for a very similar reason internally (providing a central state across multiple operations). A new TxnCtx should be created for each transaction run instead of resetting its properties. That object can be used as a key in the WeakMap or it could be manipulated directly.

There are 3 ways to go with it:

  1. Expose Transaction#_ctx as is (eg. Transaction#context).
  2. Expose Transaction#_ctx and refactor it a bit for more generic use cases.
  3. Create an entirely new property.

I would go with option (2). TxnCtx#nextCode could be turned into a generic counter, so that abstractions don't need to implement their own counter to serialize their operations. TxnCtx#toBake could be turned into an array of arbitrary callbacks to be run after a successful commit. Both of these features would be useful based on my experience.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions