diff --git a/lib/oban/engines/basic.ex b/lib/oban/engines/basic.ex index e5e0d3ca..24d2cd25 100644 --- a/lib/oban/engines/basic.ex +++ b/lib/oban/engines/basic.ex @@ -69,9 +69,13 @@ defmodule Oban.Engines.Basic do @impl Engine def insert_job(%Config{} = conf, %Changeset{} = changeset, opts) do - fun = fn -> insert_unique(conf, changeset, opts) end + if Repo.in_transaction?(conf) do + insert_unique(conf, changeset, opts) + else + fun = fn -> insert_unique(conf, changeset, opts) end - with {:ok, result} <- Repo.transaction(conf, fun), do: result + with {:ok, result} <- Repo.transaction(conf, fun), do: result + end end @impl Engine diff --git a/test/oban/engine_test.exs b/test/oban/engine_test.exs index b63c60e3..1ee15739 100644 --- a/test/oban/engine_test.exs +++ b/test/oban/engine_test.exs @@ -312,6 +312,16 @@ for engine <- [Oban.Engines.Basic, Oban.Engines.Lite, Oban.Engines.Dolphin] do assert job_1.id != job_2.id assert job_1.id == job_3.id end + + @tag skip: @engine != Basic + @tag :unboxed + @tag oban_opts: [repo: UnboxedRepo] + test "propagating db errors raised when inserting within a multi", %{name: name} do + changeset = Worker.new(%{ref: 1}) |> Ecto.Changeset.put_change(:state, "bogus") + multi = Oban.insert(name, Multi.new(), :job, changeset) + + assert_raise Postgrex.Error, fn -> UnboxedRepo.transaction(multi) end + end end describe "insert!/2" do