Skuld.Effects.DBTransaction.Ecto (skuld v0.1.12)

View Source

Ecto-based transaction handler for the DBTransaction effect.

Handles transact operations by wrapping computations in Repo.transaction/2. On normal completion, the transaction commits. On throw, suspend, or explicit rollback, the transaction rolls back.

Example

alias Skuld.Comp
alias Skuld.Effects.DBTransaction
alias Skuld.Effects.DBTransaction.Ecto, as: EctoTx

comp do
  result <- DBTransaction.transact(comp do
    user <- insert_user(attrs)
    order <- insert_order(user, order_attrs)
    return({user, order})
  end)
  return(result)
end
|> EctoTx.with_handler(MyApp.Repo)
|> Comp.run!()

With Explicit Rollback

comp do
  result <- DBTransaction.transact(comp do
    user <- insert_user(attrs)

    if invalid?(user) do
      _ <- DBTransaction.rollback({:invalid, user})
    end

    return(user)
  end)
  return(result)
end
|> EctoTx.with_handler(MyApp.Repo)
|> Comp.run!()
#=> {:rolled_back, {:invalid, user}}

Options

Accepts the same options as Repo.transaction/2:

  • :timeout - The time in milliseconds to wait for the transaction
  • :isolation - The transaction isolation level (if supported)

Summary

Functions

Install an Ecto transaction handler.

Functions

with_handler(comp, repo, opts \\ [])

Install an Ecto transaction handler.

Handles DBTransaction.transact/1 operations by running the inner computation inside Repo.transaction/2.

Behavior

For transact(comp):

  • Normal completion → commits, returns result
  • Throw sentinel → rolls back, propagates throw
  • Suspend sentinel → rolls back, propagates suspend
  • Explicit rollback(reason) → rolls back, returns {:rolled_back, reason}

Calling rollback/1 outside of a transact block raises an error.

Example

comp do
  result <- DBTransaction.transact(comp do
    _ <- insert_record(data)
    return(:ok)
  end)
  return(result)
end
|> DBTransaction.Ecto.with_handler(MyApp.Repo)
|> Comp.run!()