首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多并发写入器下的雪花更新语义

多并发写入器下的雪花更新语义
EN

Stack Overflow用户
提问于 2022-11-29 13:33:53
回答 1查看 34关注 0票数 0

我们对表单有一个查询:

代码语言:javascript
复制
update my_target_table 
set my_boolean = TRUE /* part (2) update single row in table from FALSE to TRUE */
where 
   /* part (1) here join across many tables 
      check for the where all tables agree across many rows
      finally filter down to a single row in my_target_table */
   ...
;

有许多独立的进程同时运行,它们将运行这个SQL逻辑作为它们的最终操作。我的理解是,如果没有显式交易,使用默认的自动提交选项,每个语句都有一个隐式事务,并且所有事务都是ACID。因此,如果我有多个相同的查询,如上面所述,运行在多个独立进程中:

  1. 许多独立的进程可以开始执行查询中标记为“part 1”的工作。这项工作可能与其他查询并行进行,因为它没有锁定?
  2. 如果“第1部分”的工作满足了该标准,那么一个或多个独立的进程可以更新目标表中的同一行,并在查询中标记为“part 2”。
  3. 因为每个相同的“第2部分”都会在没有显式事务的每个进程中写入单个行,并且使用默认的自动提交选项,将按照医生们在它自己的隐式事务中运行。它们在结果方面不会发生冲突,因为在这些文档中声明了ACID语义。

因此,结果将是所有这些语句都成功,而不会出现任何失败的SQL语句/失败。

我的问题是关于正确性和并行性。是否有可能两个进程可以并行运行"part 1“,或者会有一些锁定来防止这种情况发生。如果存在并行性,那么我是否正确地认为,由于存在隐式事务,而且所有作者都将相同的值设置为同一行,那么正确性就会发生,因为没有逻辑冲突或失败?

谢谢!

Update:我完全满意的是,执行此sql语句的物理计划必须对“包含”更新后的行的最终数据结构使用写锁,以便按照文档维护ACID。这些独占锁的生存期很短,在延迟方面不会明显。我的问题是读取所有其他表的并行性,就像在我的查询中一样,这些表将将其他六个表中的许多行连接到更新的表中,以找到要更新的单个行。因此,我的问题是关于读取工作的并行性,以准备写入工作,而不是写到一行的并行性。

EN

回答 1

Stack Overflow用户

发布于 2022-11-30 14:42:46

雪花锁需要编译时的资源。我不确定上述步骤在查询概要中是否有两个步骤,但是即使查询包含两个步骤,所有步骤所需的锁也是在编译时获得的。

因此,如果您同时运行这些更新,并且更新后的行将位于同一个微分区中(实际上,我可以说,大多数情况下,甚至行在另一个微分区中),我希望它们彼此阻塞。更清楚地说,这些并发查询不会运行“步骤1”和“步骤2”-它们将在编译阶段等待阻塞。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74614915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档