Skip to content

Procedures: Add transaction API #3515

Closed

Description

@gefjon

Define new host functions for acquiring, committing, aborting a transaction. Expose these to module bindings as the following interface:

impl ProcedureContext {
    /// Acquire a mutable transaction and execute `body` with read-write access to the database.
    ///
    /// If the `body` returns `Ok`, the transaction will be committed and its mutations persisted.
    /// If the `body` returns `Err`, the transaction will be rolled back and its mutations discarded.
    ///
    /// Regardless of the transaction's success or failure,
    /// the return value of `body` is not persisted to the commitlog or broadcast to subscribed clients.
    /// Clients attribute mutations performed by this transaction to `Event::UnknownTransaction`.
    ///
    /// If the transaction fails to commit after `body` returns (e.g. due to a conflict with a concurrent transaction),
    /// this method will re-invoke `body` with a new transaction in order to retry.
    pub fn with_transaction<Res, Err>(&mut  self, body: impl Fn(&TxContext) -> Result<Res, Err>)) -> Result<Res, Err> {
        todo!()
    }
}

The TxContext is a lot like a ReducerContext: it has a db field which allows access to the database, offers the rng method, has a timestamp, and probably some other stuff I'm forgetting. It inherits auth information from the enclosing ProcedureContext.

Name the new host functions with the prefix procedure_.

Attempting to perform any of the other procedure_ host calls while a transaction is open should error.

After completing this, create follow-up tickets to implement the same in C#, C++ and TypeScript.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions