Skuld.Effects.DBTransaction.Ecto (skuld v0.1.12)
View SourceEcto-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
@spec with_handler(Skuld.Comp.Types.computation(), module(), keyword()) :: Skuld.Comp.Types.computation()
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!()