我想用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")
使用别名看起来不是一种正确的方法。有没有其他方法让它工作?
从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)