Task + DbTransaction DbConnection error

Hi guys,

I would like to know if anybody could help me.
I have a genserver that calls a TaskSupervisor to start tasks like this:

 task =
      Task.Supervisor.async_nolink(
        UiccProvisioningsSupervisor,
        fn -> Toto.bar() end
      )

    Process.send_after(self(), {:kill, task}, state.task_timeout)

and a handle_info like this:

def handle_info({:kill, task}, %{tasks: tasks} = state) do
if tasks[task.ref] do
      Task.shutdown(task, :brutal_kill)
      Toto.call_to_db()
      {:noreply, %{state | tasks: Map.delete(tasks, task.ref)}}
    else
      {:noreply, state}
    end

The toto.foo contains a transaction like this:

  def foo(params) do
    Repo.transaction(fn ->
      ota_request = Repo.insert!(%Foo{} |> Foo.create_changeset(params))
      Process.sleep(150)
    end)
  end

In this case , I got in the terminate callback of the Genserver:

scheduler terminated: {{:shutdown,
  %DBConnection.ConnectionError{
    message: "client #PID<0.698.0> exited",
    reason: :error,
    severity: :error
  }},
 {DBConnection.Holder, :checkout,
  [
    #PID<0.682.0>,
    [
      log: #Function<13.1473765/1 in Ecto.Adapters.SQL.with_log/3>,
      source: "uicc_provisionings",
      cast_params: [nil, nil, ~N[2023-06-22 11:12:24], "icc_id_3529"],
      repo: SimManager.Repo,
      timeout: 15000,
      pool: DBConnection.Ownership,
      pool_size: 10
    ]
  ]}}

I found that the task is the exited client. And the problem disappears when I remove the transaction.

Hard to say 100% without real code, but my suspicion is that the Task ends up sharing a database connection with the GenServer, then brutal_killing the Task leaves the connection in an unusable state.