首页 > 解决方案 > 使用 Ecto/Elixir 锁定行“FOR UPDATE OF”特定表

问题描述

我想获得一个lockusing FOR UPDATE OF table_name. 与 相比FOR UPDATEFOR 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")

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

标签: elixirecto

解决方案


截至Ecto v3目前,无法将参数化值传递给Query.lock. 它只接受二进制文件

[命名绑定] 也不起作用,因为Ecto内部会根据需要生成别名


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

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

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

推荐阅读