使用Ecto / Elixir锁定行“FOR UPDATE OF”特定表

问题描述 投票:1回答:1

我想用lock获得一个FOR UPDATE OF table_name。与FOR UPDATE相比,FOR UPDATE OF仅锁定指定表中的行,并且不会阻止连接的行。但是,当我尝试使用以下代码段使用Ecto时,它会失败。

query =
  Call
  |> join_other_tables() # custom methods
  |> Query.lock("FOR UPDATE OF calls")

原因是Ecto使用calls的别名,例如,c0,这意味着我还必须使用锁定表达式中的别名来使其工作。

query =
  Call
  |> join_other_tables() # custom methods
  |> Query.lock("FOR UPDATE OF c0")

使用别名看起来不是一种正确的方法。有没有其他方法让它工作?

elixir ecto
1个回答
1
投票

Ecto v3开始,无法将参数化值传递给Query.lock。它接受binaries only

[命名绑定]将无法正常工作,因为Ecto内部generates aliases as it wants


以下方法将是最接近的方法,但它不起作用,因为Ecto.Query.lock/2不允许插值。

使用具有插值能力的Ecto.Query.API.fragment和关键字查询语法。有点像:

from c in Call,
  join: ..., # custom methods
  lock: fragment("FOR UPDATE OF ?", c)
© www.soinside.com 2019 - 2024. All rights reserved.