Sql 为什么在红移中在事务结束之前释放隐式表锁?

Sql 为什么在红移中在事务结束之前释放隐式表锁?,sql,etl,amazon-redshift,Sql,Etl,Amazon Redshift,我有一个ETL过程,它以红移增量方式构建维度表。它按以下顺序执行操作: 开始交易 创建类似foo的表staging\u foo 将数据从外部源复制到暂存_foo 对foo执行大规模插入/更新/删除,以便它与staging\u foo匹配 丢下胡福 提交事务 该流程单独运行,但为了在发生故障时实现对foo的连续流刷新和冗余,我同时运行了多个流程实例。当这种情况发生时,我偶尔会出现并发序列化错误。这是因为两个进程都在重叠事务中从foo_staging重放对foo的一些相同更改 发生的情况是,第一个进

我有一个ETL过程,它以红移增量方式构建维度表。它按以下顺序执行操作:

  • 开始交易
  • 创建类似foo的表staging\u foo
  • 将数据从外部源复制到暂存_foo
  • 对foo执行大规模插入/更新/删除,以便它与staging\u foo匹配
  • 丢下胡福
  • 提交事务
  • 该流程单独运行,但为了在发生故障时实现对
    foo
    的连续流刷新和冗余,我同时运行了多个流程实例。当这种情况发生时,我偶尔会出现并发序列化错误。这是因为两个进程都在重叠事务中从
    foo_staging
    重放对
    foo
    的一些相同更改

    发生的情况是,第一个进程创建了
    staging\u foo
    表,第二个进程在尝试创建具有相同名称的表时被阻止(这就是我想要的)。当第一个进程提交其事务(可能需要几秒钟)时,我发现第二个进程在提交完成之前被取消阻止。因此,它似乎在提交之前获取
    foo
    表的快照,这导致插入/更新/删除(其中一些可能是冗余的)失败

    我是根据文件进行理论推导的,文件中说:

    同时进行的交易彼此是看不见的;他们无法检测到彼此的变化。每个并发事务将在事务开始时创建数据库的快照。大多数SELECT语句、DML命令(如COPY、DELETE、INSERT、UPDATE和TRUNCATE)以及以下DDL命令首次出现时,将在事务中创建数据库快照:

    ALTER TABLE(添加或删除列)

    创建表

    升降台

    截断表

    上面引用的文档让我有些困惑,因为它首先说将在事务开始时创建快照,但随后说仅在某些特定DML/DDL操作首次出现时创建快照

    我不想在替换
    foo
    时执行深度复制,而不是增量更新它。我有其他的进程不断地查询这个表,所以我从来没有一个时间可以不间断地替换它。另一个问题对deep copy提出了类似的问题,但它对我不起作用:

    有没有一种方法可以让我以避免并发序列化错误的方式执行操作?我需要确保读取权限可用于
    foo
    ,因此我不能
    锁定该表。

    好的,Postgres(因此红移[或多或少])用于事务隔离,而不是a、MySQL等)。简单地说,每个事务都对数据进行操作,因为它在事务开始时就存在

    因此,您的评论“我有几个进程实例同时运行”解释了这个问题。如果流程2在流程1运行时启动,则流程2无法查看流程1的结果