我们对表单有一个查询:
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。因此,如果我有多个相同的查询,如上面所述,运行在多个独立进程中:
因此,结果将是所有这些语句都成功,而不会出现任何失败的SQL语句/失败。
我的问题是关于正确性和并行性。是否有可能两个进程可以并行运行"part 1“,或者会有一些锁定来防止这种情况发生。如果存在并行性,那么我是否正确地认为,由于存在隐式事务,而且所有作者都将相同的值设置为同一行,那么正确性就会发生,因为没有逻辑冲突或失败?
谢谢!
Update:我完全满意的是,执行此sql语句的物理计划必须对“包含”更新后的行的最终数据结构使用写锁,以便按照文档维护ACID。这些独占锁的生存期很短,在延迟方面不会明显。我的问题是读取所有其他表的并行性,就像在我的查询中一样,这些表将将其他六个表中的许多行连接到更新的表中,以找到要更新的单个行。因此,我的问题是关于读取工作的并行性,以准备写入工作,而不是写到一行的并行性。
发布于 2022-11-30 14:42:46
雪花锁需要编译时的资源。我不确定上述步骤在查询概要中是否有两个步骤,但是即使查询包含两个步骤,所有步骤所需的锁也是在编译时获得的。
因此,如果您同时运行这些更新,并且更新后的行将位于同一个微分区中(实际上,我可以说,大多数情况下,甚至行在另一个微分区中),我希望它们彼此阻塞。更清楚地说,这些并发查询不会运行“步骤1”和“步骤2”-它们将在编译阶段等待阻塞。
https://stackoverflow.com/questions/74614915
复制相似问题