amazon redshift 并发写入导致插入记录,导致重复
Posted
技术标签:
【中文标题】amazon redshift 并发写入导致插入记录,导致重复【英文标题】:amazon redshift concurrent write results in inserted records, causing duplicates 【发布时间】:2014-05-22 06:49:40 【问题描述】:我一直在尝试解决同一个表上的两个并发更新导致创建/插入额外记录的问题。从未在任何其他关系数据库中经历过这种情况,我也不会。因此,我认为在跨多个节点分布查询的 redshifts 架构中可能存在一个怪癖,但无法确定或提供真实世界的示例。
在运行这两个更新之前,我将新数据插入到表中。插入包含填写一天数据的每日快照,大多数列都有准备好更新以填充它们的空值。
更新是并发运行的,它们是简单的更新 sql,更新它们各自的列。如果单独运行,我看不到创建额外的记录并且没有重复。
更新在整个表中进行,超过 2 亿条记录,但是重复只发生在最近填充的记录中(那几天的新数据。
这有点让人担心,因为我永远不会假设更新会创建新记录,除了第一次插入创建的记录。
更奇怪的是,重复的记录包含不同的数据。
通过查看 redshifts 查询日志 (stl_query),我已确认没有其他查询超出预期。
【问题讨论】:
"重复的记录包含不同的数据" - 如果它们包含不同的值,那么它们如何“重复”?您是否对相关列有唯一索引?表的定义是什么? 重复项位于复合主键上。 redshift 不强制执行密钥,因此可能会发生重复。我看到的是重复记录(根据复合主键。)。但是其他值不同。然而,唯一正在执行的 sql 是两个更新,并且只有当它们同时运行时。在任何其他典型数据库中,这都不应该发生。所以我质疑这在红移上怎么可能。 【参考方案1】:我很难相信更新创造了新的价值,你真的确定吗? 当涉及到同一张表上的并发事务时,我经历过复杂的情况,所以我建议你明确地锁定你的表:
lock table <table> in exclusive mode;
在您操作之前(独占模式将允许读取,但任何写入尝试都必须等待)
如果您不这样做并且 2 个事务尝试更新(插入很好,顺便说一句)同一个表,您很可能会收到“错误:1023 - 详细信息:表上的可序列化隔离违规” - 或者您的行为正在报道
【讨论】:
我应该考虑锁定表。我已经重构了查询以同步执行。但是我在另一张桌子上发生了同样的问题。所以我会在更新之前尝试锁定表。如果它解决了这个问题,会通知您。以上是关于amazon redshift 并发写入导致插入记录,导致重复的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Pentaho 处理 Amazon Redshift 中缓慢变化的维度?
如何在 Amazon Redshift 中使用 Hibernate 插入实体