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 indexes

Bir 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: true varsayar ve bir çağrı yolu bir GSI'yi gösteren bir IndexName ekler.
  • 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, IndexName eklenerek yeniden kullanıldı.

Nasıl düzeltilir

  1. GSI okumalarından ConsistentRead'i kaldırın (veya false olarak 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'}}
      })
    );
  2. Yazma sonrası okuma mı gerekiyor? Temel tabloyu ConsistentRead: true ile sorgulayın — aradığınız anahtar tablonun kendi bölüm anahtarı olduğunda mümkündür.

  3. Aynı bölüm anahtarı, farklı sıralama mı? Onu, tutarlı okumaları destekleyen bir LSI (tablo oluşturmada oluşturulur) olarak modelleyin.

  4. 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

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.