我正在阅读“卡桑德拉:最终指南”,我试图理解非正规化是如何运作的。
它们有一个数据模型,包含两个包含酒店信息的表,一个“酒店”表和一个"hotels_by_poi“表(poi代表感兴趣的点)。每张桌子上都有酒店的名称、电话和地址。
我的理解是这样做的,因为hotels_by_poi表是针对您正在通过兴趣点搜索酒店的查询而优化的(按hotel_id集群酒店,但在poi_name上进行分区),酒店表用于查询特定酒店(在hotel_id上进行分区)。
但是,我想知道如何确保这些数据保持同步以进行更新?由于我们并没有真正的事务,所以似乎(有一些轻量级的事务(我认为这些事务可能适用于表中的一行?),而批处理似乎并没有提供任何跨国担保)。
例如,如果我想更新酒店名称,我需要执行以下查询
UPDATE hotel.hotels
SET name = 'Updated Hotel Name'
WHERE hotel_id = 1234;
# For each poi_id associated with my hotel
UPDATE hotel.hotels_by_poi
SET name = 'Updated Hotel Name'
WHERE hotel_id = 1234 AND poi_id = 5678;因此,如果一家酒店的兴趣点接近5个点,那么总共将有6个查询。
然而,酒店名称的两次更新可能发生在同一时间。现在,我们在每组查询之间都有一个竞争条件。我们可能会遇到这样的情况:第一次更新中有3次获胜,第二次更新胜利3次。留下不一致的地方。
我们如何在诸如Cassandra这样的数据库中正确地同步这些信息?
发布于 2018-09-17 06:04:52
您可以使用批处理语句来实现原子性。将这6个查询放在一个批处理中,这样所有查询都可以一起执行。
https://stackoverflow.com/questions/52360735
复制相似问题