我一直在尝试解决一个问题,即同一个表上的两个并发更新导致创建/插入额外的记录。从未在任何其他关系数据库中经历过这种情况,我也不会。因此,我认为在跨多个节点分发查询的 redshifts 架构中可能是一个怪癖,但无法确定或提供真实世界的示例。
在运行这两个更新之前,我将新数据插入到表中。插入包含填写一天数据的每日快照,大多数列都有空值,准备好更新以填充它们。
更新是并发运行的,它们是简单的更新 sql,更新它们各自的列。如果单独运行,我看不到创建的其他记录且没有重复。
更新在整个表中运行,超过 2 亿条记录,但是重复只发生在最近填充的记录中(那几天的新数据。
这有点令人担忧,因为我永远不会假设更新会创建新记录,除了第一次插入创建的记录之外。
更奇怪的是,重复记录持有不同的数据。
我已经通过查看 redshifts 查询日志 (STL_query) 来确认没有其他查询超出预期。
最佳答案
我真的很难相信更新创造了新的值(value),你真的确定吗?
当涉及到同一张表上的并发事务时,我遇到了复杂的情况,所以我建议你明确地锁定你的表:
lock table <table> in exclusive mode;
在您操作它之前(独占模式将允许读取,但任何写入尝试都必须等待)
如果您不这样做并且 2 个事务尝试更新(插入很好,顺便说一句)同一个表,您很可能会收到“错误:1023 - 详细信息:表上的可序列化隔离违规” - 或者您报告的行为
关于sql - 亚马逊 Redshift 并发写入导致插入记录,导致重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799688/