当前位置: 首页 > 知识库问答 >
问题:

使用Ecto/Elixir锁定行“用于更新”特定表

归俊
2023-03-14

我想获取一个lock使用FORUPDATE OFtable_name。与FORUPDATE相比,FORUPDATE OF仅锁定指定表中的行,并且连接的行不会被阻塞。但是,当我尝试使用以下代码段使用ecto执行此操作时,它失败了。

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

原因是ecto为调用使用别名,例如c0,这意味着我还必须在lock表达式中使用别名才能使其正常工作。

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

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

共有2个答案

郭浩穰
2023-03-14

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

from c in Call,
  join: ..., # custom methods
  lock: fragment("FOR UPDATE OF ?", c)
董飞航
2023-03-14

Ectov3开始,无法将参数化值传递给Query.lock。它只接受二进制文件。

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

下面的方法可能是最接近的方法,但是它也不起作用,因为< code>Ecto。Query.lock/2不允许插值。

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

from c in Call,
  join: ..., # custom methods
  lock: fragment("FOR UPDATE OF ?", c)
 类似资料:
  • 问题内容: 我正在将SQLAlchemy与python结合使用,并且我想更新等于此查询的表中的特定行: 我通过sql alchemy编写了此代码,但无法正常工作: 返回此错误: 我该怎么做? 问题答案: 通常,您不使用,而是设置属性:

  • 我有一个这样的实体: 我有一个生成HQL的代码: 执行更新的代码: 问题: 乐观锁在这里出现吗?在上述情况下,Hibernate是否会自动处理乐观锁定(运行HQL且没有会话)? 如果上述情况不正确,我需要自己实现:我阅读了Hibernate文档,其中说,我需要用注释一个字段。但是我应该专门为此在表中添加这个新字段吗?或者我可以为注释指定任何现有字段?这里有什么特殊处理吗? 在乐观锁定期间抛出的异常

  • 背景: < li >我正在使用< code>npm和< code>docker在< code>node.js中编写代码。我试图让我的docker文件在构建时使用缓存,这样不会花太长时间。 < li >我们有一个“通用”存储库,用于保存在各种存储库中使用的逻辑,并通过npm软件包进行传播。 问题是: 我希望docker文件不要使用我的“通用”包上的缓存。 Docker文件: package.json

  • 我正在使用ApachePOI将数据写入Excel文件,我希望第一行为只读,其他行可以随时编辑。但我没有找到有效的解决方法。 下面是我的代码: 看起来这个java代码块应该可以工作,但实际上它不仅会锁定第一行,还会锁定其他行的空单元格。 所以我想知道,有没有一种有效的方法可以使用apachepoi只锁定excel文件的第一行?

  • 我想使用DynamoDBMapper只更新项目的特定属性。例如,我有一个带有属性的用户表。,id,name,地址。 我想只更新地址属性,而不是其他字段(选择性更新)。 我可以使用UpdateItemSpec找到一个示例,但在DynamoDBMapper中找不到。使用UpdateItemSpec,我可以使用withUpdateExpression()定义更新表达式。更多细节可以在这里找到。 是否有任