Skip to content

Commit d715d59

Browse files
committed
Use direct adapter rollback
1 parent ab64e1d commit d715d59

File tree

2 files changed

+16
-20
lines changed

2 files changed

+16
-20
lines changed

lib/ecto/repo/transaction.ex

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,8 @@ defmodule Ecto.Repo.Transaction do
22
@moduledoc false
33
@dialyzer :no_opaque
44

5-
def transact(repo, _name, fun, {adapter_meta, opts}) when is_function(fun, 0) do
6-
adapter_meta.adapter.transaction(adapter_meta, opts, fn ->
7-
case fun.() do
8-
{:ok, result} ->
9-
result
10-
11-
{:error, reason} ->
12-
rollback(repo, reason)
13-
14-
other ->
15-
raise ArgumentError,
16-
"expected to return {:ok, _} or {:error, _}, got: #{inspect(other)}"
17-
end
18-
end)
5+
def transact(repo, name, fun, adapter_opts) when is_function(fun, 0) do
6+
transact(repo, name, fn _repo -> fun.() end, adapter_opts)
197
end
208

219
def transact(repo, _name, fun, {adapter_meta, opts}) when is_function(fun, 1) do
@@ -25,7 +13,7 @@ defmodule Ecto.Repo.Transaction do
2513
result
2614

2715
{:error, reason} ->
28-
rollback(repo, reason)
16+
adapter_meta.adapter.rollback(adapter_meta, reason)
2917

3018
other ->
3119
raise ArgumentError,
@@ -48,7 +36,7 @@ defmodule Ecto.Repo.Transaction do
4836

4937
{:error, operation} ->
5038
raise """
51-
operation #{inspect operation} is rolling back unexpectedly.
39+
operation #{inspect(operation)} is rolling back unexpectedly.
5240
5341
This can happen if `repo.rollback/1` is manually called, which is not \
5442
supported by `Ecto.Multi`. It can also occur if a nested transaction \

test/ecto/repo_test.exs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ defmodule Ecto.RepoTest do
182182
end
183183

184184
defmodule MySchemaOneField do
185-
use Ecto.Schema
185+
use Ecto.Schema
186186

187187
@primary_key false
188188
schema "my_schema" do
@@ -2148,8 +2148,8 @@ defmodule Ecto.RepoTest do
21482148
end
21492149

21502150
describe "dynamic repo" do
2151-
setup do
2152-
{:ok, pid} = TestRepo.start_link(name: nil)
2151+
setup config do
2152+
{:ok, pid} = TestRepo.start_link(name: config.test)
21532153
TestRepo = TestRepo.put_dynamic_repo(pid)
21542154
:ok
21552155
end
@@ -2174,7 +2174,15 @@ defmodule Ecto.RepoTest do
21742174
assert Process.get(:ecto_prepared)
21752175
end
21762176

2177-
test "keeps the proper repo in multi" do
2177+
test "keeps the proper repo in transact rollback", config do
2178+
assert TestRepo.transact(fn -> {:error, :oops} end) == {:error, :oops}
2179+
2180+
# Also check it works with named repos
2181+
TestRepo.put_dynamic_repo(config.test)
2182+
assert TestRepo.transact(fn -> {:error, :oops} end) == {:error, :oops}
2183+
end
2184+
2185+
test "keeps the proper repo in multi" do
21782186
fun = fn repo, _changes -> {:ok, repo} end
21792187
multi = Ecto.Multi.new() |> Ecto.Multi.run(:run, fun)
21802188
assert {:ok, changes} = TestRepo.transaction(multi)

0 commit comments

Comments
 (0)