作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用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 使用了调用
的别名,例如c0
,这意味着我还必须在锁定表达式中使用别名才能使其正常工作.
query =
Call
|> join_other_tables() # custom methods
|> Query.lock("FOR UPDATE OF c0")
使用别名看起来不是一个正确的方法。还有其他方法可以让它工作吗?
最佳答案
从 Ecto v3
开始,无法将参数化值传递给 Query.lock
。它接受binaries only .
[命名绑定(bind)]也不起作用,因为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)
关于elixir - 使用 Ecto/Elixir 锁定行 "FOR UPDATE OF"特定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129239/
我是一名优秀的程序员,十分优秀!