elixir - 使用 Ecto/Elixir 锁定行“FOR UPDATE OF”特定表
问题描述
我想获得一个lock
using 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
. 它只接受二进制文件。
[命名绑定] 也不起作用,因为Ecto
内部会根据需要生成别名。
以下方法将是最接近的方法,但它也不起作用,因为Ecto.Query.lock/2
不允许插值。
使用Ecto.Query.API.fragment
具有插值能力的 ,与关键字查询语法。有点像:
from c in Call,
join: ..., # custom methods
lock: fragment("FOR UPDATE OF ?", c)
推荐阅读
- json - 将 xml 输入转换为 json 格式,跳过父键但将其值处理给子键
- javascript - 这是 setState({scale: 'c', temperature}) 好吗?
- javascript - 如何在谷歌地图上添加两个位置的标记?
- input - Optaplanner 混合车辆、接送等的输入格式
- magento - Magento 自定义 ajax 购物车。购物规则不适用
- python - 如何在python中同步数据帧?
- android - 重复的 zip 条目 [classes.jar:android/support/v4/media/MediaBrowserCompat$MediaItem$1.class]
- android - 单击选项卡后重新加载选项卡内容
- java - 这个方法的解释?
- java - 在 xsd 模式中表示列表