WEB / WEB-18.03
NoSQL ve key-value stores
NoSQL ailesinin farklı storage modellerini ayır; public note’un key/value, version ve lifetime contract’ını seçilmiş local adapter üzerinde oku.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Value found
- Public read hazır
Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.
- Application
- Public note read istendi
- Local adapter
- Sonuç yok
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Key mapping
Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Lifetime kararı
Seçilen logical clock=49, expiresAt=50’den küçüktür. Store value’yu bulur; bu lookup sonucu henüz application’ın JSON shape kararı değildir.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Clock=49 < expiry=50; value bulundu
- Result decision
- Application kararı yok
- Lookup sonucu
Adapter public:note:tea için found ve JSON string döndürür. Değer id=tea, title=Tea note, version=1 taşır; parse ve shape validation sonraki yerel adımdadır.
- Application
- Public note read istendi
- Local adapter
- JSON string bulundu
- Selected KV owner
- Clock=49 < expiry=50; value bulundu
- Result decision
- Application kararı yok
- Result işleme
Application JSON string’i parse eder, id/title/version shape’ini doğrular ve bağımsız copy oluşturur. Bu copy’deki field değişikliği store’a write operation göndermez.
- Application
- Public note read istendi
- Local adapter
- JSON string bulundu
- Selected KV owner
- Clock=49 < expiry=50; value bulundu
- Result decision
- Parse edilmiş copy; shape geçerli
- Application kararı
Application lookup sonucunu kullanır; bu local sonuç persistence, replica visibility veya permission kanıtı değildir.
- Application
- Tea note; version=1
- Local adapter
- JSON string bulundu
- Selected KV owner
- Clock=49 < expiry=50; value bulundu
- Result decision
- Parse edilmiş copy; shape geçerli
Lifetime ended
- Public read hazır
Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.
- Application
- Public note read istendi
- Local adapter
- Sonuç yok
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Key mapping
Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Lifetime kararı
logical clock=50, expiresAt=50 sınırına ulaşır; bu profile equality missing üretir. Store lookup için value bırakmaz; application’a henüz missing sonucu dönmemiştir.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Clock=50; expiry=50; missing
- Result decision
- Application kararı yok
- Lookup sonucu
Adapter missing döndürür; bu öğretim kaydında fixtureReason=expired vardır. Genel ürün API’sinin her missing için bu nedeni bildiği varsayılmaz; JSON value yoktur.
- Application
- Public note read istendi
- Local adapter
- Missing; örnek reason=expired
- Selected KV owner
- Clock=50; expiry=50; missing
- Result decision
- Application kararı yok
- Result işleme
Missing sonucunda parse edilecek note yoktur ve bu dal default note yaratmaz. Cache kullanılıyorsa başka authoritative owner’dan fallback read ayrı contract ister; bu sahne öyle bir read çalıştırmaz.
- Application
- Public note read istendi
- Local adapter
- Missing; örnek reason=expired
- Selected KV owner
- Clock=50; expiry=50; missing
- Result decision
- Parsed note yok; default yok
- Application kararı
Application lookup sonucunu kullanır; bu local sonuç persistence, replica visibility veya permission kanıtı değildir.
- Application
- Missing alındı; note yok; fallback gösterilmez
- Local adapter
- Missing; örnek reason=expired
- Selected KV owner
- Clock=50; expiry=50; missing
- Result decision
- Parsed note yok; default yok
Stale revision
- Koşullu update hazır
Application, public:note:tea için önceki read’den expectedVersion=1 taşır ve koşullu update ister. Bu eski beklenti store’un güncel version’ını kanıtlamaz; henüz update kabul edilmemiştir.
- Application
- Koşullu update hazır; expectedVersion=1
- Local adapter
- Sonuç yok
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Key mapping
Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Yeni revision
Araya giren update store’da id=tea, title=Coffee note, version=2 oluşturmuştur. Application expectedVersion=1 beklentisini korur; yeni owner state’ini eski read’den bildiği varsayılmaz.
- Application
- Expected version 1
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Current Coffee note; version=2
- Result decision
- Application kararı yok
- Revision koşulu
Owner aynı serialized karar içinde expectedVersion=1 ile currentVersion=2 değerlerini karşılaştırır. Mismatch vardır; bu local conditional update kararı distributed lock veya collection transaction değildir.
- Application
- Expected version 1
- Local adapter
- Expected=1; current=2 karşılaştırıldı
- Selected KV owner
- Current Coffee note; version=2
- Result decision
- Application kararı yok
- Stale update reddi
Mismatch nedeniyle update uygulanmaz; afterValue Coffee note/version=2 olarak korunur. Bu son value ayrı read ile karşılaştırılabilir; ret cevabı tek başına bütün transaction’ın rollback edildiği anlamına gelmez.
- Application
- Expected version 1
- Local adapter
- Expected=1; current=2 karşılaştırıldı
- Selected KV owner
- Coffee note; version=2 korundu
- Result decision
- Application kararı yok
- Conflict sonucu
Application stale update’in uygulanmadığını görür; local koşullu karar bütün transaction için rollback sonucu değildir.
- Application
- Update reddedildi; expectedVersion=1
- Local adapter
- Expected=1; current=2 karşılaştırıldı
- Selected KV owner
- Coffee note; version=2 korundu
- Result decision
- Conflict; overwrite yok
Store unavailable
- Public read hazır
Application, public:note:tea key’i için read hazırlar. Bu örneğin store’u yalnız kendi memory state’i için authoritative’tir; key prefix identity veya permission oluşturmaz.
- Application
- Public note read istendi
- Local adapter
- Sonuç yok
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Key mapping
Adapter public:note:tea key’ini kullanır; public prefix store authorization veya value validation uygulamaz.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Stored JSON; örnek lifetime
- Result decision
- Application kararı yok
- Store unavailable
Örneğin availability koşulu false olarak seçilmiştir; bundan note’un absent veya expired olduğu çıkarılmaz.
- Application
- Public note read istendi
- Local adapter
- Key selected: public:note:tea
- Selected KV owner
- Örnek availability=false
- Result decision
- Application kararı yok
- Error ayrı
Adapter unavailable error verir; onu missing result’a dönüştüren fallback bu contract’ta yoktur.
- Application
- Public note read istendi
- Local adapter
- Error; value/missing sonucu yok
- Selected KV owner
- Örnek availability=false
- Result decision
- Application kararı yok
- Kararı durdur
Application authoritative empty state veya default note üretmez; unavailable sonucu nedeniyle karar durur.
- Application
- Public note read istendi
- Local adapter
- Error; value/missing sonucu yok
- Selected KV owner
- Örnek availability=false
- Result decision
- Karar durdu; default yok
ROLLER · STATE · VERİ AKIŞI
NoSQL bir tek database davranışı değildir
NoSQL, relational tables dışındaki farklı data modellerini bir arada anmak için kullanılır; document ve key-value modelleri bu dersin iki örneğidir. Bir ürünün query dili, schema validation, transaction ve consistency özellikleri diğerine otomatik taşınmaz. MongoDB document model’inde collection içindeki fields farklı olabilir; bu, application’ın field anlamlarını düşünmemesi demek değildir. MongoDB schema validation destekler; embedding veya referencing seçimi application access pattern’i ve relationship ownership’iyle yapılır.
Key-value model’de application key seçer, store karşılık gelen value’yu döndürür. public:note:tea lookup key’i örnekteki public note’u seçer; prefix authentication veya authorization uygulamaz. Local adapter JSON string saklar; application onu id/title/version içeren object’e çevirip shape’ini doğrular. Store’dan string gelmesi JSON’un doğru schema’da olduğunu kanıtlamaz. Redis GET için mevcut string, missing key ve wrong-type error farklı sonuçlardır; bu sözleşme bütün NoSQL ürünlerine genellenmez.
Data modeli seçilirken birlikte okunacak fields, birlikte atomic değişmesi gereken state ve authoritative owner belirlenir. MongoDB’de single-document write atomic olabilir; çok document değiştiren operation’ın bütünü tek atomic write değildir. Multi-document transactions da vardır. Redis EXEC commands’ı sıralı bir grup olarak işler, fakat SQL rollback davranışını aynen sağlamaz. Dersin local adapter’ı tek process’te serialized access kullanır; Redis veya MongoDB operation’ı değildir.
Lifetime, revision ve availability ayrı sonuçlardır
Örnekte note expiresAt=50 logical clock birimine sahiptir. Clock=49’da value bulunur; clock=50 expiry boundary’sinde missing olur. Bu gerçek wall-clock timer ölçümü değildir. Eviction ise lifetime bitmeden memory pressure veya policy nedeniyle key’in çıkarılmasıdır. Redis maxmemory policy key evict edebilir; noeviction yeni write’a error verebilir. Key hiç yaratılmamış da olabilir. Basit missing sonucu bu nedenleri tek başına ayırmaz.
TTL bir field değil store lifecycle contract’ıdır. Redis SET normal replacement’ta eski TTL’yi temizler; retention gerekiyorsa KEEPTTL gibi açık option vardır. EXPIRE key’e timeout koyar. Fixture replacement ve explicit eviction ayrı yerel olaylar olarak kayıtlıdır. GET success, persistence garantisi değildir; Redis’te RDB, AOF veya persistence olmadan çalışma farklı kayıp sınırları taşır. Burada memory-only adapter process dışına data saklamaz, orderly restart veya crash durability iddiası yoktur.
Version=1 okuyan application daha sonra owner’da version=2 görürse eski beklentiyle update kabul edilmemelidir. Local adapter expected ve current revision’ı tek serialized decision’da karşılaştırır; uyuşmazlıkta value değişmez. Bu distributed atomicity testi değildir; Redis WATCH/EXEC kendi optimistic condition sözleşmesine sahiptir. Unavailable store ayrı error’dur: missing gibi authoritative empty state’e çevrilmez. Replica visibility, consistency ve retry policy ürün/topology özelinde belirlenir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Version stale
- KV owner ve encoding seçildi
public:note:tea, JSON string olarak saklanan public not key’idir. Key prefix’i data mapping içindir; actor’a okuma veya write izni vermez.
- KV operation context
- Key: public:note:tea
- Owner/version gate
- Version check pending
- Application state boundary
- State unchanged
- Expected ve current version ayrıldı
stale kaydı expectedVersion=1 ve currentVersion=2 içerir. Caller’ın eski beklentisi, store’daki güncel Coffee note değerini authoritative olmaktan çıkarmaz.
- KV operation context
- Expected=1
- Owner/version gate
- Current=2
- Application state boundary
- Decision pending
- Serialized owner gate reddetti
accepted=false selected single-owner decision’dır. Bu karar current version’ı karşılaştırıp stale update’i uygulamaz; ayrı read/write’ın her sistemde atomic olduğunu iddia etmez.
- KV operation context
- Version mismatch known
- Owner/version gate
- Accepted=false
- Application state boundary
- Update withheld
- After value korundu
afterValue id=tea, title=Coffee note ve version=2 içerir. Negatif fixture yalnız ret label’ını değil güncel data’nın korunmasını da gösterir.
- KV operation context
- After: Coffee note
- Owner/version gate
- After version=2
- Application state boundary
- No stale overwrite
- Product atomicity yanlış genişletilmedi
MongoDB single-document atomicity bütün updateMany işlemini otomatik atomic yapmaz. Redis EXEC de SQL rollback ile aynı contract değildir; operation scope açık tutulur.
- KV operation context
- Single-owner scope
- Owner/version gate
- Product scopes differ
- Application state boundary
- No collection-wide claim
- Persistence sonucu eklenmedi
selectedModel persistence=none kullanır. State’in korunması memory adapter için bilinir; replica visibility, disk durability veya crash recovery kanıtı değildir.
- KV operation context
- Memory state preserved
- Owner/version gate
- Persistence=none
- Application state boundary
- Durability unestablished
Unavailable
- Unavailable kaydı seçildi
unavailable.status=error’dır. Bu sonuç expiry veya eviction nedeniyle missing olan lookup ile aynı contract sonucu değildir.
- KV operation context
- Status: error
- Owner/version gate
- Fallback decision pending
- Application state boundary
- Default not created
- Missing dönüşümü reddedildi
treatedAsMissing=false korunur. Owner’dan cevap alınamamasını empty note saymak authoritative state bilinmediğinde yeni yanlış state yaratabilir.
- KV operation context
- Error ≠ missing
- Owner/version gate
- Authoritative value UNKNOWN
- Application state boundary
- No guessed empty note
- Default creation sınırı kapandı
createdDefaultNote=false’tur. Adapter error, başarıyla missing okuyan path’e geçirilmediği için state-changing fallback başlatılmaz.
- KV operation context
- Unavailable known
- Owner/version gate
- Default creation=false
- Application state boundary
- No state-changing fallback
- Cache ve authority ayrıldı
Memory cache missing olduğunda başka owner’dan read gerekebilir. Bu fixture authoritativeForFixtureOnly=true der; gerçek database fallback owner’ı tanımlanmış sayılmaz.
- KV operation context
- Fixture owner only
- Owner/version gate
- External fallback unspecified
- Application state boundary
- No invented source value
- Başarı cevabı persistence olmadı
Redis GET success bile persistence kanıtı değildir. Burada error sonucu için daha da az state kanıtı vardır; outage, missing ve durability ayrı sorulardır.
- KV operation context
- State unknown on error
- Owner/version gate
- Durability separate
- Application state boundary
- No clean default state
- Güvenli sonuç doğru raporlandı
Bilinen sonuç error’ın missing’e çevrilmediği ve default note yaratılmadığıdır. Data gerçekten var mı, expired mı veya silindi mi bu branch’ten çıkarılamaz.
- KV operation context
- No false missing
- Owner/version gate
- No default mutation
- Application state boundary
- Data existence UNKNOWN
VARSAYIM · SINIR · KONTROL
Missing sonucu ownership’i açıklamaz
Key lookup missing olduğunda hangi data owner’ının okunduğunu ve adapter’ın hangi error’ları ayırdığını sor. Expired cache entry ile hiç yazılmamış authoritative record aynı product kararı değildir. Memory-only cache yokluğu database fallback gerektirebilir; authoritative store outage’ını missing’e çevirmek yanlış default state üretebilir. Örneğin logical lifetime ve availability=false koşulları bu ayrımı gösterir; gerçek Redis telemetry’si değildir.
Key naming data’yı düzenler; public prefix tek başına izin sağlamaz. JSON içindeki id, title ve version’ın beklenen shape’iyle eşleşmesi ayrı validation’dır. Store success’ı application semantics için yeterli sanmak yanlış note veya revision üzerinde karar vermeye yol açabilir. Field/schema kontrolü ile data ownership birlikte okunur; bu ikisi string lookup sonucundan türetilmez.
Atomicity etiketini operation sınırına bağla
Local adapter’ın expected revision reddi yalnız bir serialized owner decision’ı kanıtlar. Read ve write’ı ayrı adımlarda yapıp arada state değişebilmesini dışlamak başka varsayımdır. MongoDB single-document atomicity’sini bütün collection’a, Redis EXEC serialized processing’ini SQL rollback’e çevirmek de başka yanlış genellemelerdir. Etki, birbirine bağlı data’nın kısmen değişmesi veya stale kararın yeni state’i ezmesi olabilir; bu ders harmless version mismatch’te state’in korunduğunu gösterir.
Review sırasında başarı cevabını persistence ve replica visibility ile eşitleme. Process memory’sinde accepted update crash sonrasında kaybolabilir; TTL, eviction ve persistence policy farklı mekanizmalardır. Kontrol beklentisi selected operation scope, failure sonucu ve application fallback kararının açık olmasıdır. Burada gerçek cluster, replication lag, concurrent clients veya durability ölçümü yoktur; modelin sessizce bu yetenekleri varmış gibi çizmesi de yanlış kanıt olur.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
TTL ve eviction
- Logical clock sınırı okundu
hit.clock=49 ve expiresAt=50 için value found’dur. Bu logical clock sonucu production Redis’in gerçek zaman veya eviction policy ölçümü değildir.
- Value/lifetime observation
- Clock=49
- Adapter contract review
- Expires at=50
- Evidence conclusion
- Status=found
- Expiry equality sonucu eşleştirildi
expiry.clock=50 anında status=missing ve fixtureReason=expired’dır. Sınır anı normal hit’ten farklıdır; equality hâlâ found diye okunmaz.
- Value/lifetime observation
- Clock=50
- Adapter contract review
- Status=missing
- Evidence conclusion
- Reason=expired
- Pre-expiry eviction ayrı tutuldu
eviction.clock=49 için status=missing’tir. Reason explicit authored eviction event olduğundan bu missing, clock=50 expiry ile aynı neden değildir.
- Value/lifetime observation
- Eviction at=49
- Adapter contract review
- Missing before expiry
- Evidence conclusion
- Cause differs
- Runtime reason genellenmedi
fixtureReason bu örneğin gözlem alanıdır. Gerçek adapter her missing sonucunda expiry, eviction veya hiç yazılmama nedenini ayrı sunmak zorunda değildir.
- Value/lifetime observation
- Fixture cause known
- Adapter contract review
- Product cause may be unknown
- Evidence conclusion
- No invented telemetry
- Replacement TTL contract’ı okundu
replacement oldExpiresAt=50, newExpiresAt=null ve ttlPreserved=false içerir. Replacement seçimi TTL’yi temizler; eski TTL’nin korunacağı varsayılmaz.
- Value/lifetime observation
- Old TTL boundary=50
- Adapter contract review
- New expiry=null
- Evidence conclusion
- TTL preserved=false
- Lifetime ile persistence ayrıldı
Expiry, eviction ve replacement farklı lifetime mekanizmalarıdır. Hiçbiri tek başına disk restore, replication veya process crash sonrası data varlığı kanıtı değildir.
- Value/lifetime observation
- Lifetime rules known
- Adapter contract review
- Persistence separate
- Evidence conclusion
- No restore guarantee
Copy ve selector
- Found value encoding’i incelendi
Store JSON string tutar; hit.value id=tea, title=Tea note ve version=1 olarak parsed data’dır. Store lookup ile shape validation aynı operation değildir.
- Value/lifetime observation
- Stored: JSON string
- Adapter contract review
- Returned: parsed data
- Evidence conclusion
- Copy review pending
- Application copy boundary okundu
applicationMutationChangesStore=false dönen object’in store state’inden ayrı olduğunu bildirir. Local field değiştirmek store’a otomatik update göndermek değildir.
- Value/lifetime observation
- Returned copy independent
- Adapter contract review
- Store mutation=false
- Evidence conclusion
- No shared-object assumption
- Error selector koşulu tanımlandı
Selector status=error ve treatedAsMissing=true olan observation’ları sayar. Normal error kaydı treatedAsMissing=false olduğundan expected=0’dır.
- Value/lifetime observation
- Error/missing conversion condition
- Adapter contract review
- Normal expected=0
- Evidence conclusion
- Negative policy retained
- Pozitif comparison sınırlandı
positiveExpected=1 yalnız inconsistent observation karşılaştırmasıdır. Bu alan product’ın gerçekten error’ı missing’e dönüştürdüğü olay gibi raporlanmaz.
- Value/lifetime observation
- Comparison expected=1
- Adapter contract review
- Fixture only
- Evidence conclusion
- No actual incident claim
- Eksik observation sonucu ayrıldı
Record veya treatedAsMissing field’ı yoksa count=0 doğru error handling kanıtı olmaz. Adapter outcome ve application fallback için coverage gerekir.
- Value/lifetime observation
- Coverage may be missing
- Adapter contract review
- Handling UNKNOWN
- Evidence conclusion
- No clean selector conclusion
- Copy, policy ve product scope’u ayrıldı
Parsed copy ve finite decision memory adapter’a aittir; productsExecuted=[] kalır. Gerçek Redis/MongoDB davranışı veya namespace authorization için ayrı kanıt gerekir.
- Value/lifetime observation
- Local copy behavior known
- Adapter contract review
- Products not executed
- Evidence conclusion
- Permission separate
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Adapter contract’ını uygulama kararına bağla
Application sınırında get sonucu için found/value, missing ve unavailable/error ayrımını yaz. Value’nun schema validation’ı store operation’dan sonraki ayrı local adımdır; fixture parsed object’i kopya olarak döndürerek application mutation’ının store’u sessizce değiştirmemesini sağlar. Key mapping yalnız public synthetic note için seçilmiştir. Gerçek uygulamada identity/authorization, namespace isolation ve result presentation ayrıca tasarlanır.
Missing için fallback varsa hangi owner’dan read yapılacağını ve error’da neyin authoritative sayılacağını belirle. Bu örnekte unavailable sonucu empty note yaratmaz, state-changing karar durur. Cache’in authoritative database gibi kullanılması bu contract’tan çıkarılamaz. Expiry/eviction işaretlerini debug amaçlı ayrı gözlemlemek yararlıdır; gerçek adapter her sebebi bilmeyebilir. Bu nedenle missing reason field’ı authored fixture observability’sidir, bütün Redis clients’ın sunduğu runtime field değildir.
Lifecycle policy’sini bağımsız doğrula
Logical clock ile expiry’nin hemen öncesini ve boundary anını karşılaştır; aynı value için expiry öncesindeki eviction ayrı sonuç olsun. Replacement’ın lifetime’ı koruyup korumadığı operation contract’ına yazılır. Redis policy’si seçilirken ürün dokümanı ve workload gerekir; örnekteki saat veya capacity değerleri production ayarı değildir. Local adapter’ın sonucu gerçek Redis/MongoDB davranışının kanıtı sayılmaz.
Revision için current version’ı bağımsız read ile gözle; stale update sonrasında value’nun korunmasını doğrula. Local operation tek owner decision’ıdır; başka ürünlerde conditional write, transaction ve consistency sınırları kendi sözleşmelerine bağlıdır. Persistence gerekiyorsa process memory, snapshot, append-only log ve restore ayrı ele alınır. Accepted memory update, crash sonrasında korunmuş data veya replica’da görünür state anlamına gelmez.
ŞİMDİ VAKAYA UYGULA
Missing, unavailable ve stale version neden aynı karar değildir?
Public note memory adapter’ında error default note üretmez; stale version güncel state’i korur. TTL, eviction, replacement ve parsed copy ayrı alanlarla incelenir.
Vakadaki cached representation’ı authoritative data owner’la karşılaştır. Stored value, revision, transaction ve cache copy için aynı completion sonucunu kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Public note key/version/lifetime ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"selectedModel": {
"runtime": "own Python in-memory adapter, serialized owner access",
"productsExecuted": [],
"key": "public:note:tea",
"valueEncoding": "JSON string",
"authoritativeForFixtureOnly": true,
"persistence": "none"
},
"hit": {
"clock": 49,
"expiresAt": 50,
"status": "found",
"value": {
"id": "tea",
"title": "Tea note",
"version": 1
},
"applicationMutationChangesStore": false
},
"expiry": {
"clock": 50,
"status": "missing",
"fixtureReason": "expired"
},
"eviction": {
"clock": 49,
"status": "missing",
"fixtureReason": "explicit authored eviction event, not measured Redis policy"
},
"stale": {
"expectedVersion": 1,
"currentVersion": 2,
"accepted": false,
"afterValue": {
"id": "tea",
"title": "Coffee note",
"version": 2
},
"decisionScope": "selected serialized single owner"
},
"unavailable": {
"status": "error",
"treatedAsMissing": false,
"createdDefaultNote": false
},
"replacement": {
"oldExpiresAt": 50,
"newExpiresAt": null,
"ttlPreserved": false,
"contract": "selected replacement clears TTL; Redis SET reference only"
},
"productScopes": {
"mongoSingleDocumentAtomic": true,
"mongoUpdateManyWholeAutomaticallyAtomic": false,
"redisExecIsSqlRollback": false,
"redisGetSuccessProvesPersistence": false
},
"selector": {
"language": "XPath",
"xml": "<audit><kv status=\"error\" treatedAsMissing=\"false\"/></audit>",
"xpath": "count(/audit/kv[@status='error' and @treatedAsMissing='true'])",
"expected": 0,
"positiveFixtureXml": "<audit><kv status=\"error\" treatedAsMissing=\"true\"/></audit>",
"positiveExpected": 1,
"scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
"missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
}
}- selectedModel
- Local adapter scope; ürün runtime’ı değil.
- hit/expiry/eviction
- Logical clock ve farklı missing koşulları.
- stale
- Expected revision ile current value korunması.
- unavailable/replacement
- Error semantiği ve seçilmiş TTL replacement contract.
- selector
- Synthetic missing/error kararını sayan inert XPath.
Public note için memory-only Python adapter kullanılır. Redis/MongoDB, cluster, gerçek timer veya durability sonucu değildir; missing reason örneğin observation field’idir.
İki yanlış kanı
NoSQL schema veya transaction gerektirmez.
Data contract her model’de gerekir; selected product document validation ve farklı atomicity/transaction scope sunabilir.
Key bulunamadıysa store erişilebilir ve authoritative state boş demektir.
Missing’in birden çok nedeni vardır; unavailable ayrı error’dur. Cache yokluğu authoritative record yokluğuna eşit değildir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Adapter hata döndürdü. Bu sonucu key bulunamadı diye yorumlayıp varsayılan note oluşturabilir miyiz?
- Evet. Başarısız her GET, key’in bulunmadığını kanıtlar.
- Hayır. treatedAsMissing=false; varsayılan note oluşturulmaz.
Gerekçeli cevabı oku
Hayır. treatedAsMissing=false; varsayılan note oluşturulmaz. — Hata, store’daki kaydın var olup olmadığını söylemez. Bu bilinmeyen sonucu missing olarak yorumlayıp yeni veri oluşturmak doğru değildir.
Bu replacement işleminde TTL korunuyor mu? Örnek gerçek Redis üzerinde mi çalışıyor?
Dersten seçilen artifact alanları; öğretim örneği
- selectedModel
- {"runtime":"own Python in-memory adapter, serialized owner access","productsExecuted":[],"key":"public:note:tea","valueEncoding":"JSON string","authoritativeForFixtureOnly":true,"persistence":"none"}
- replacement
- {"oldExpiresAt":50,"newExpiresAt":null,"ttlPreserved":false,"contract":"selected replacement clears TTL; Redis SET reference only"}
- TTL temizleniyor; productsExecuted listesi boş.
- Redis GET başarılı olduğu için TTL ve persistence korunur.
Gerekçeli cevabı oku
TTL temizleniyor; productsExecuted listesi boş. — newExpiresAt=null ve ttlPreserved=false, bu adapter’ın tanımlı sonucudur. In-memory adapter’ın çalışması gerçek Redis testi değildir.
MongoDB single-document atomicity, updateMany ve Redis EXEC neden SQL transaction rollback ile aynı kavram değildir?
Gerekçeli cevabı oku
Bir document güncellemesinin atomic olması, bütün updateMany işleminin tek atomic işlem olduğu anlamına gelmez. Redis EXEC de SQL transaction rollback davranışıyla eşitlenmez. Buradaki stale-version rejection, işlemleri sırayla değerlendiren yerel owner modelinin sonucudur. Gerçek Redis/MongoDB deployment’ı veya distributed atomicity test edilmemiştir.
□ Atomicity’nin kapsamını işlem ve ürün sözleşmesine bağladım.
□ In-memory adapter’ı gerçek ürün testi saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- MongoDB 9.0 Manual — Data ModelingData Modeling in MongoDB · Developing with a Flexible Data Model · Document Relationships
- MongoDB 9.0 Manual — Atomicity and TransactionsAtomicity and Transactions · Details
- Redis — GETGET command description · Return information
- Redis — SETSET command description · Optional arguments: EX/PX/EXAT/PXAT/KEEPTTL
- Redis — EXPIREEXPIRE command description · Required arguments
- Redis — TransactionsUsage · Errors inside a transaction · What about rollbacks? · Optimistic locking using check-and-set · WATCH explained
- Redis — Key evictionUsing the maxmemory configuration directive · Eviction policies
- Redis — PersistenceRedis persistence · RDB advantages · AOF advantages · How durable is the append only file?