Consistent reads are not supported on global secondary indexes
TL;DR — Bir global ikincil indeksi hedefleyen bir Query veya Scan üzerinde ConsistentRead: true ayarladınız. GSI'ler temel tablodan eşzamansız olarak çoğaltır ve yalnızca nihai tutarlı okumalara hizmet verir — bayrak bir tercih değil, kesin bir hatadır. Bayrağı kaldırın ya da gerçekten yazma sonrası okuma tutarlılığına ihtiyacınız varsa temel tabloyu okuyun (veya anahtarı bir LSI'ye tasarlayın).
Ne anlama gelir
ValidationException: Consistent reads are not supported on global secondary indexesBir GSI, fiziksel olarak kendi bölümleri ve kapasitesi olan kendi indeks yapısıdır; DynamoDB temel tablo yazmalarını ona eşzamansız olarak yayar. Az önce yazdığınız bir öğe henüz indekse ulaşmamış olabileceğinden, DynamoDB ona karşı güçlü tutarlı bir okumayı yerine getiremez — bu yüzden bir GSI IndexName ile birleştirilmiş ConsistentRead: true doğrudan reddedilir. AWS belgeleri açıktır: bir GSI'yi ConsistentRead true olarak ayarlanmış şekilde sorgularsanız bir ValidationException alırsınız.
Yerel ikincil indeksler farklıdır: bir LSI bölümünü temel tabloyla paylaşır, bu yüzden ConsistentRead: true orada desteklenir.
Neden olur
- Bayrak genel olarak ayarlandı — paylaşılan bir sorgu yardımcısı veya istemci sarmalayıcısı her okuma için
ConsistentRead: truevarsayar ve bir çağrı yolu bir GSI'yi gösteren birIndexNameekler. - Bir LSI bir GSI oldu — yerel bir indeks için yazılmış kod (bayrağın yasal olduğu) global bir indekse yöneltildi.
- Kopyala-yapıştır temel tablo sorgusu — tabloda meşru biçimde güçlü tutarlılık kullanan bir sorgu,
IndexNameeklenerek yeniden kullanıldı.
Nasıl düzeltilir
GSI okumalarından
ConsistentRead'i kaldırın (veyafalseolarak ayarlayın — varsayılan):await client.send( new QueryCommand({ TableName: 'Orders', IndexName: 'status-index', KeyConditionExpression: '#s = :open', // ConsistentRead: true ← delete this line for a GSI ExpressionAttributeNames: {'#s': 'status'}, ExpressionAttributeValues: {':open': {S: 'OPEN'}} }) );Yazma sonrası okuma mı gerekiyor? Temel tabloyu
ConsistentRead: trueile sorgulayın — aradığınız anahtar tablonun kendi bölüm anahtarı olduğunda mümkündür.Aynı bölüm anahtarı, farklı sıralama mı? Onu, tutarlı okumaları destekleyen bir LSI (tablo oluşturmada oluşturulur) olarak modelleyin.
Ya da gecikmeyi uygulamada soğurun — GSI yayılımı genellikle hızlıdır; UI akışları için, zaten sahip olduğunuz az önce yazılmış veriyi döndürmek, indeksi yeniden okumaktan iyidir.
DynoTable masaüstü uygulaması her tablonun indekslerini gösterir ve onları doğrudan sorgulamanıza olanak tanır — ve hangi indeksin global, hangisinin yerel olduğunu bildiğinden, bu hata sınıfı basitçe ortaya çıkmaz.
İlgili hatalar
- GSI throttles the base table — GSI'lerin yazma tarafı bağlaşımı.
- The table does not have the specified index
- Cannot update GSI while it is being created
- Kod örneği: Query a GSI in Node.js — doğru yapılmış nihai tutarlı bir GSI sorgusu.
- Öğrenin: Why GSIs are eventually consistent · GSI vs LSI · Consistency
References
- Query — Amazon DynamoDB API Reference
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.