代码之家  ›  专栏  ›  技术社区  ›  Ostap Maliuvanchuk

使用EXTO/Elixir锁定“用于更新”特定表格的行

  •  0
  • Ostap Maliuvanchuk  · 技术社区  · 5 年前

    我想获得一份工作 lock 使用 FOR UPDATE OF table_name .相比于 FOR UPDATE , FOR UPDATE OF 仅锁定指定表中的行,并且连接的行不会被阻止。然而,当我尝试使用下面的代码片段使用Exto时,它失败了。

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

    原因是埃克托使用了一个别名 calls 例如 c0 ,这意味着我还必须在锁表达式中使用别名才能使其工作。

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

    使用别名看起来不是一种正确的方法。还有别的办法让它工作吗?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Aleksei Matiushkin    5 年前

    截至 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)
    
        2
  •  0
  •   IrishDubGuy    2 年前

    请注意,现在似乎可以使用片段插入表名,请参见 https://github.com/elixir-ecto/ecto_sql/pull/189 .因此,Aleksei的解决方案现在应该可行了:

    from c in Call,
      join: ..., # custom methods
      lock: fragment("FOR UPDATE OF ?", c)