处理加载时间较长的高度标准化数据库中的不一致

问题描述 投票:0回答:1

我有一个带有许多外键的高度规范化的数据库,我的应用程序对此数据执行计算。 首先,我的应用程序加载各个客户的多个实体(假设通过 customer_id)。 在数据加载阶段(最多可能需要 15 分钟),链接表中的行可能会被其他服务删除,从而导致数据不一致并导致进程崩溃。

一位同事建议将加载阶段包装在事务中并将隔离级别设置为可串行化。虽然这似乎是一个潜在的解决方案,但我担心潜在的缺点。

在这种情况下使用 SERIALIZABLE 隔离级别有哪些潜在缺点? 是否有更好的替代方案或最佳实践来处理此问题并在加载阶段保持数据一致性?

postgresql transactions serializable isolation-level data-consistency
1个回答
0
投票

SERIALIZABLE
隔离级别不会阻止您出现外键违规错误。如果有的话,您将收到更多错误,因为任何可能的异常都会导致序列化错误,这迫使您重复整个事务。

如果并发事务删除了您要插入的数据所依赖的数据,则无法防止出现问题。

我认为唯一的解决办法是在加载数据时暂停任何并发的冲突删除。如果您不能从应用程序中保证这一点,您可以使用数据库技术:对您依赖的所有数据加一个

SELECT ... FOR KEY SHARE
锁,以防止并发会话删除它们。这迫使您在单个事务中执行整个数据加载,考虑到过程的长度,这并不好。但如果这些数据加载不是一直发生,那么它很可能是可以接受的。

© www.soinside.com 2019 - 2024. All rights reserved.