← Back to context

Comment by KraftyOne

1 month ago

(DBOS co-founder here) DBOS does exactly this! From the post:

DBOS has a special @DBOS.Transaction decorator. This runs the entire step inside a Postgres transaction. This guarantees exactly-once execution for databases transactional steps.

Sorry, i mean with external transactions to the workflow steps. Like I can select, insert, and launch a workflow in a HTTP handler

  • Yeah, you can launch workflows directly from an HTTP handler. So here's some code that idempotently launches a background task from a FastAPI endpoint:

        @app.get("/background/{task_id}/{n}")
        def launch_background_task(task_id: str, n: int) -> None:
          with SetWorkflowID(task_id): # Set an idempotency key
            DBOS.start_workflow(background_task, n) # Start the workflow in the background
    

    Does that answer your question?

    • Not OP, but I don't think that's it.

      Suppose you had an existing postgres-backed CRUD app with existing postgres transactions, and you want to add a feature to launch a workflow _atomically_ within an existing transaction, can you do that? (I.e. can the DBOS transaction be a nested transaction within a transaction defined outside the DBOS library?)

      4 replies →