WEB / WEB-16.S05
Business invariants ve workflow state machines
Domain kararını state, authority ve effect sonucu üzerinden okumak.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Reservation kabul
- Command hazırlanmış
Client, copy-A için quantity=1, expectedRevision=7 ve commandId=reservation-A intent’ini hazırladı. Price, role ve güncel state server authority’sindedir; service henüz command’ı almadı.
- Client
- reservation-A; copy-A; quantity=1; expectedRevision=7
- Workflow service
- Güncel permission kararı bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Service command aldı
Service reservation command’ını aldı. Önceden açılmış sayfa veya command key, güncel authorization kararının yerine geçmez.
- Client
- Reservation command hazır
- Workflow service
- Command geldi; current gate bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Current gate kararı
Güncel permission için sağlanan kanıt kabul edildi. State ve revision koşulları store transaction’ında ayrıca değerlendirilmelidir.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Available; revision 7; receipt yok
- Yerel store çağrısı
Service, aynı işlemdeki memory SQLite store’a bound command’ı yerel olarak verdi. Bu bir ağ paketi değildir; henüz conditional guard, committed write veya receipt sonucu yoktur.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Command geldi; transaction koşulu bekliyor
- Local transaction sonucu
Conditional update ve receipt aynı local transaction’da commit edildi; revision 8 ve tek effect oluştu.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Reserved; revision 8; receipt hazır
- Yerel transaction sonucu
Service, aynı işlemdeki store çağrısından committed receipt sonucunu aldı ve client yanıtını hazırladı. Bu yerel dönüş, client’a ulaşan response değildir.
- Client
- Reservation command hazır
- Workflow service
- Committed receipt geldi; client yanıt hazır
- Catalog store
- Reserved; revision 8; receipt hazır
- Client outcome aldı
Client committed reservation receipt’ini aldı; aynı command retry’ı current permission ile yeniden değerlendirilir.
- Client
- Receipt geldi; tek committed effect
- Workflow service
- Committed receipt geldi; client yanıt hazır
- Catalog store
- Reserved; revision 8; receipt hazır
- Yerel outcome kaydı
Client aldığı sonucu yerel kaydına işledi. Bu adım yeni bir catalog write veya başka serviste bir effect gerçekleştirmez.
- Client
- Committed receipt yerel kayıtta; tek effect
- Workflow service
- Committed receipt geldi; client yanıt hazır
- Catalog store
- Reserved; revision 8; receipt hazır
Revision eski
- Command hazırlanmış
Client, copy-A için quantity=1, expectedRevision=6 ve commandId=reservation-A intent’ini hazırladı. Price, role ve güncel state server authority’sindedir; service henüz command’ı almadı.
- Client
- reservation-A; copy-A; quantity=1; expectedRevision=6
- Workflow service
- Güncel permission kararı bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Service command aldı
Service reservation command’ını aldı. Önceden açılmış sayfa veya command key, güncel authorization kararının yerine geçmez.
- Client
- Reservation command hazır
- Workflow service
- Command geldi; current gate bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Current gate kararı
Güncel permission için sağlanan kanıt kabul edildi. State ve revision koşulları store transaction’ında ayrıca değerlendirilmelidir.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Available; revision 7; receipt yok
- Yerel store çağrısı
Service, aynı işlemdeki memory SQLite store’a bound command’ı yerel olarak verdi. Bu bir ağ paketi değildir; henüz conditional guard, committed write veya receipt sonucu yoktur.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Command geldi; transaction koşulu bekliyor
- Local transaction sonucu
Beklenen revision=6, mevcut revision=7 ile uyuşmaz. Conditional update sıfır satır etkiler; state available kalır ve receipt üretilmez.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Yerel transaction sonucu
Service yerel store çağrısından olumsuz sonucu aldı. Committed receipt yoktur; client için ret kararı hazırdır ama henüz client’a ulaşmadı.
- Client
- Reservation command hazır
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Client outcome aldı
Client olumsuz sonucu aldı. Başlangıçtaki available state korundu; yeni receipt body veya committed write oluşmadı.
- Client
- Ret geldi; body/receipt teslimi/committed write yok
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Yerel outcome kaydı
Client aldığı sonucu yerel kaydına işledi. Bu adım yeni bir catalog write veya başka serviste bir effect gerçekleştirmez.
- Client
- Ret yerel kayıtta; yeni receipt/body yok
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
Permission eksik
- Command hazırlanmış
Client, copy-A için quantity=1, expectedRevision=7 ve commandId=reservation-A intent’ini hazırladı. Price, role ve güncel state server authority’sindedir; service henüz command’ı almadı.
- Client
- reservation-A; copy-A; quantity=1; expectedRevision=7
- Workflow service
- Güncel permission kararı bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Service command aldı
Service reservation command’ını aldı. Önceden açılmış sayfa veya command key, güncel authorization kararının yerine geçmez.
- Client
- Reservation command hazır
- Workflow service
- Command geldi; current gate bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Current gate kararı
Güncel permission kanıtı eksiktir. Command store’a gönderilmeden ret hazırlandı; write yapılmaz ve receipt body üretilmez.
- Client
- Reservation command hazır
- Workflow service
- Permission unknown; ret hazır; receipt yok
- Catalog store
- Available; revision 7; receipt yok
- Client ret aldı
Client, güncel permission kanıtı eksik olduğu için ret aldı. Store’a command gönderilmedi; receipt body ve committed write oluşmadı.
- Client
- Ret geldi; body/receipt teslimi/committed write yok
- Workflow service
- Permission unknown; ret hazır; receipt yok
- Catalog store
- Available; revision 7; receipt yok
Rollback kararı
- Command hazırlanmış
Client, copy-A için quantity=1, expectedRevision=7 ve commandId=reservation-A intent’ini hazırladı. Price, role ve güncel state server authority’sindedir; service henüz command’ı almadı.
- Client
- reservation-A; copy-A; quantity=1; expectedRevision=7
- Workflow service
- Güncel permission kararı bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Service command aldı
Service reservation command’ını aldı. Önceden açılmış sayfa veya command key, güncel authorization kararının yerine geçmez.
- Client
- Reservation command hazır
- Workflow service
- Command geldi; current gate bekliyor
- Catalog store
- Available; revision 7; receipt yok
- Current gate kararı
Güncel permission için sağlanan kanıt kabul edildi. State ve revision koşulları store transaction’ında ayrıca değerlendirilmelidir.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Available; revision 7; receipt yok
- Yerel store çağrısı
Service, aynı işlemdeki memory SQLite store’a bound command’ı yerel olarak verdi. Bu bir ağ paketi değildir; henüz conditional guard, committed write veya receipt sonucu yoktur.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Command geldi; transaction koşulu bekliyor
- Local transaction sonucu
Transaction içindeki failure sonrasında açık rollback yapılır. State available ve revision=7 olarak kalır; yeni committed effect veya receipt oluşmaz.
- Client
- Reservation command hazır
- Workflow service
- Güncel permission kabul; store command hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Yerel transaction sonucu
Service yerel store çağrısından olumsuz sonucu aldı. Committed receipt yoktur; client için ret kararı hazırdır ama henüz client’a ulaşmadı.
- Client
- Reservation command hazır
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Client outcome aldı
Client olumsuz sonucu aldı. Başlangıçtaki available state korundu; yeni receipt body veya committed write oluşmadı.
- Client
- Ret geldi; body/receipt teslimi/committed write yok
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
- Yerel outcome kaydı
Client aldığı sonucu yerel kaydına işledi. Bu adım yeni bir catalog write veya başka serviste bir effect gerçekleştirmez.
- Client
- Ret yerel kayıtta; yeni receipt/body yok
- Workflow service
- Ret geldi; write/body yok kararı hazır
- Catalog store
- Available; revision 7; ret hazır; receipt yok
ROLLER · STATE · VERİ AKIŞI
Invariant, transition ve authority
Business invariant, her kabul edilmiş operation’dan sonra doğru kalması gereken domain koşuludur. Tek kopyalık catalog’da remaining capacity negatif olmaz; bir copy aynı anda iki aktif reservation sahibi olmaz; completed command ikinci effect üretmez. Workflow state machine bu koşulları state, action ve guard üzerinden ifade eder. available -> reserved geçişi yalnız current permission, quantity, capacity ve revision kontrolünden sonra kabul edilir.
Client intent bildirir: copy-A, quantity 1, expectedRevision 7 ve commandId reservation-A. Client price, role veya current state için authority değildir. Artifact’te 12 fictional priceUnits server catalog kaydıdır; para veya ödeme değildir. Reader-reserver role verified server context’inden, available state store’dan gelir. Schema doğrulaması input’un biçimini kontrol eder; bu üç authority’yi client değerleriyle değiştirmeyi onaylamaz.
Revision ve idempotency farklı sorunları çözer
Revision 7, bu command’ın hangi state üzerinde karar vermek istediğini belirtir. Conditional update current revision 7 ve state available iken tek satır değiştirir; affected row sayısı sıfırsa eski karar write üretmez. Guard ile write aynı transaction sınırındadır. Başarılı commit revision’ı 8 yapar ve receipt’i kaydeder. SQLite local fixture sırayla çalışır; parallel request, bütün isolation modları veya distributed lock davranışı sınanmaz.
Idempotency aynı logical command’ın yeniden değerlendirilmesinde effect’i çoğaltmama contract’ıdır. Command key authenticated actor, action, resource ve normalized parameters’a bağlıdır. Aynı retained command tekrar geldiğinde current permission kontrol edilir; kabul edilmiş receipt dönmek ikinci reservation üretmez. Farklı parameter aynı command’ın yeni anlamı sayılmaz. Key’e sahip olmak permission değildir. Retention bittikten sonra veya external outcome bilinmezken güvenli retry kendiliğinden kanıtlanmış olmaz.
Invite, booking, coupon ve recovery karşılaştırması
Invite belirli recipient ile workspace’e bağlı pending ve unexpired state ister. Booking current capacity ve authorized reserver ile available state’i tüketir. Coupon eligibility, approved terms, kalan kullanım ve validity period ister; client’ın istediği benefit tek başına server koşulu değildir. Recovery farklı purpose taşır: account-bound verified evidence, unexpired ve unused transaction gerekir. Normal login role’u recovery proof yerine geçirilmez.
Bu dört akışın guard isimleri benzer olabilir ama nesneleri ve evidence kaynakları farklıdır. FlowFamilies tablosu bir engine implementation’ı değildir; her operation için domain contract’ı çıkarmaya yarar. Recovery için credential, gerçek link veya code üretilmez; invite mesajı gönderilmez ve coupon/payment kullanılmaz. Ortak ders, state transition ile purpose ve current actor bağını birlikte tutmak, ayrıca one-time effect ile idempotent receipt’i ayırmaktır.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Revision eski
- Reservation koşulları belirlendi
Duru copy-A için quantity=1 ile reserve ister. Güncel record available ve revision=7’dir; komutun expectedRevision değeri 6’dır.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- Current: available, rev=7
- Receipt sınırı
- Receipt hazırlanmadı
- Permission ve revision ayrıldı
Bu row currentPermissionDeclared=true içerir. Ret nedeni permission değildir; izinli actor’ın komutu bile güncel revision ile uyuşmak zorundadır.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- Permission=true
- Receipt sınırı
- Dispatch bekliyor
- İlk geçiş sınırı uygulandı
Dispatch gerçekleşir fakat conditional revision kontrolü uyuşmaz. expectedCommittedWrite=false; available record reserved’a dönüşmez.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- Dispatch=true; commit=false
- Receipt sınırı
- Body=null
- State ve revision korundu
Final state available, final revision 7’dir. Quantity veya commandId’nin doğru olması revision precondition’ının yerine geçmez.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- Available; revision=7
- Receipt sınırı
- Reserved body yok
- Başarı receipt’i verilmedi
expectedReceiptDelivery=false ve expectedBody=null’dır. Resource’ın hâlâ available olması, bu eski komutun başarılı sayılması anlamına gelmez.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- Commit yok
- Receipt sınırı
- Receipt delivery=false
- Ret nedeni dar yorumlandı
Bu row bilinen revision uyuşmazlığını gösterir. Tek başına actor’ın kötü niyetini veya concurrency isolation’ın genel doğruluğunu kanıtlamaz.
- Komut koşulları
- Expected revision=6
- Geçiş ve record
- State değişmedi
- Receipt sınırı
- Bilinen ret / eksik kanıt ayrı
Permission eksik
- Reservation koşulları belirlendi
Duru copy-A için reserve ister, fakat currentPermissionDeclared=null’dır. Aynı record’un available olması eksik permission kanıtını tamamlamaz.
- Komut koşulları
- Permission=null
- Geçiş ve record
- Current: available, rev=7
- Receipt sınırı
- Receipt hazırlanmadı
- Permission ve revision ayrıldı
Null, doğrulanmış false permission ile aynı kayıt değildir. Gate sonucu hesaplanamadığı için actor’ın yetkisini tahmin ederek reserve başlatılmaz.
- Komut koşulları
- Permission=null
- Geçiş ve record
- Permission evidence eksik
- Receipt sınırı
- Dispatch bekliyor
- İlk geçiş sınırı uygulandı
expectedDispatch=false tutulur. Permission kanıtı olmadan transaction ve reserve effect’ine geçilmez; receipt de üretilmez.
- Komut koşulları
- Permission=null
- Geçiş ve record
- Dispatch=false; commit=false
- Receipt sınırı
- Body=null
- State ve revision korundu
Final state available ve final revision 7 olarak kalır. Caller’ın bildirdiği role veya priceUnits, server identity ve catalog authority yerine geçemez.
- Komut koşulları
- Permission=null
- Geçiş ve record
- Available; revision=7
- Receipt sınırı
- Reserved body yok
- Başarı receipt’i verilmedi
expectedReceiptDelivery=false ve expectedBody=null kalır. Eksik permission sonucu, geçmiş bir receipt veya command key kullanılarak allow’a çevrilmez.
- Komut koşulları
- Permission=null
- Geçiş ve record
- Commit yok
- Receipt sınırı
- Receipt delivery=false
- Ret nedeni dar yorumlandı
Bilinen sonuç dispatch ve write’ın yapılmamasıdır; actor’ın gerçek permission sonucu bilinmezdir. Eksik kanıt otomatik kötü niyet veya verified deny değildir.
- Komut koşulları
- Permission=null
- Geçiş ve record
- State değişmedi
- Receipt sınırı
- Bilinen ret / eksik kanıt ayrı
VARSAYIM · SINIR · KONTROL
Bozulan varsayım: doğru sıra domain izni verir
Red perspective bir akışın ekran sırasını izlemeyi authorization kanıtı saymaz. Available sayfasını görmüş olmak current reservation state’i veya actor permission’ı kanıtlamaz. Permission-missing satırında evidence null’dır; yanlış olduğu söylenmez ama write için gereken olumlu kanıt yoktur. Command store’a dispatch edilmeden ret hazır olur; receipt ve public result body yoktur.
Stale-revision ise farklı bir failure boundary gösterir. Actor izni vardır, command store’a gelir; current revision beklenen 6 değil 7 olduğu için conditional write sıfır satır etkiler. Bu sonuç permission ret değildir ve copy state unchanged kalır. Domain review doğru failure reason’ı kaydeder: identity, state ve commit birbirinin yerine geçmez. Bu ders gerçek booking veya payment sisteminde race denemesi yürütmez.
Bozulan varsayım: effect denendi, başarı tamamlandı
Effect-failed satırında local transaction kontrollü bir failure nedeniyle açık rollback yapar. Receipt yalnız commit’den sonra dönmelidir; başarısız attempt bir reserved body üretmez. Bu fixture’da rollback sonucu bilinir. External result absent kavramsal satırında ise commitEvidence null’dır; response kaybından “kesin write olmadı” sonucu çıkarılmaz. Local transaction başka servisin effect’ini atomik yapmaz.
Idempotency review retained receipt’in current authorization’dan önce dönmediğini de kontrol eder. Önceden başarılı command, şimdi permission ret olan actor’a receipt verme izni sağlamaz. Aynı command ID farklı resource veya quantity ile gelirse eski sonuçla sessiz eşleştirilmez. Etki incelemesi gerçek outcome ile unknown evidence’ı ayırır; arbitrary parallel operation, coupon tüketme veya recovery denemesi oluşturmaz.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Receipt ve yetki
- Saklanan komut kaydı okundu
reservation-A daha önce bir effect üretmiştir. idempotencyLedger aynı komutun saklanan sonucunu effects=1 ile gösterir; tekrar yeni effect yaratmamak ayrı bir özelliktir.
- Workflow gözlemi
- Command: reservation-A
- Tuple karşılaştırması
- Historical effects=1
- İnceleme kararı
- Yeni receipt bekliyor
- Güncel permission kaydı seçildi
same command permission denied row’unda currentPermission=false’tur. Parametreler aynı olsa da önceki kabul güncel resource permission vermez.
- Workflow gözlemi
- Current permission=false
- Tuple karşılaştırması
- Same parameters=true
- İnceleme kararı
- Receipt gate kapalı
- Receipt kararı ayrı doğrulandı
expectedReceipt=false kalırken expectedEffects=1 korunur. İnceleme, önceki effect’in geri alındığını değil yeni receipt tesliminin reddedildiğini kaydeder.
- Workflow gözlemi
- Current permission=false
- Tuple karşılaştırması
- Historical effects=1
- İnceleme kararı
- Expected receipt=false
- Idempotency authority’ye çevrilmedi
commandId tekrarı effect sayısını sınırlamaya yardım eder. Actor, action, resource ve parametre bağlarıyla güncel permission kontrolünün yerine geçmez.
- Workflow gözlemi
- Command key ≠ permission
- Tuple karşılaştırması
- Effects hâlâ 1
- İnceleme kararı
- Yeni teslim yok
- Farklı resource branch’i ayrıldı
Başka row’da currentPermission=true olsa bile sameBoundParameters=false nedeniyle receipt reddedilir. Permission ile komut eşleşmesi iki bağımsız koşuldur.
- Workflow gözlemi
- İki bağımsız gate
- Tuple karşılaştırması
- Parameter binding gerekli
- İnceleme kararı
- Eski receipt genellenmez
- İnceleme için ortak tuple seçildi
Command, actor/action/resource bağları, güncel permission ve effect/receipt sayaçları birlikte incelenir. Yalnız aynı key’i görmek teslim veya yetki kanıtı değildir.
- Workflow gözlemi
- Binding tuple gerekli
- Tuple karşılaştırması
- Güncel permission gerekli
- İnceleme kararı
- Receipt withheld
Effect bilinmiyor
- Failure kaydı sınıflandırıldı
external result absent kaydı yalnız kavramsal bir durumdur. authorizationEvidence=true olsa da commitEvidence=null’dır; dış effect’in gerçekleşip gerçekleşmediği bilinmez.
- Workflow gözlemi
- Permission evidence=true
- Tuple karşılaştırması
- Commit evidence=null
- İnceleme kararı
- Receipt=false
- Eksik sonuç başarısızlık sayılmadı
Receipt bulunmaması effect’in hiç oluşmadığını göstermez. İnceleme null commit kanıtını false commit’e dönüştürmeden korur.
- Workflow gözlemi
- Sonuç kanıtı eksik
- Tuple karşılaştırması
- Commit UNKNOWN
- İnceleme kararı
- No receipt evidence
- Yerel rollback kaydı karşılaştırıldı
controlled local transaction failure row’u rollbackExecuted=true ve commit=false bildirir. Bu bilinen rollback sonucu, dış sonucu eksik branch için varsayılmaz.
- Workflow gözlemi
- External: UNKNOWN
- Tuple karşılaştırması
- Local: rollback known
- İnceleme kararı
- İki failure ayrı
- Transaction kapsamı sınırlandı
Yerel transaction state ve receipt record’unu birlikte koruyabilir. Bunun dış service effect’ini aynı atomic sınırda yaptığına dair kanıt yoktur.
- Workflow gözlemi
- Yerel atomic sınır
- Tuple karşılaştırması
- External atomicity kanıtı yok
- İnceleme kararı
- Sonuç hâlâ UNKNOWN
- Otomatik tekrar kararı verilmedi
automaticRetrySafe=false kaydı belirsiz sonucu otomatik tekrar için yeterli saymaz. Yeniden effect üretmeden önce sonucu ve retained command ilişkisini uzlaştırmak gerekir.
- Workflow gözlemi
- Commit UNKNOWN
- Tuple karşılaştırması
- Automatic retry=false
- İnceleme kararı
- Uzlaştırma gerekli
- Kanıtın son sınırı korundu
Bu kayıtlar yerel karar ayrımlarını öğretir; gerçek ödeme, dış service veya paralel contention ölçümü değildir. Bilinmeyen effect için başarı ya da temiz rollback sonucu verilmez.
- Workflow gözlemi
- Yerel kararlar bilinir
- Tuple karşılaştırması
- External effect UNKNOWN
- İnceleme kararı
- Başarı receipt’i yok
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Guard ve commit için tek local transaction
Blue implementation fake catalog row’u current revision ve available state koşuluyla değiştirir. Affected rows tam bir ise revision artırılır ve command receipt aynı transaction’da kaydedilir. Bir local failure branch açık rollback ile hem state update’i hem receipt insert’ini geri alır. SQLite’de hata otomatik olarak bütün transaction’ı her zaman geri alır varsayımına dayanılmaz; rollback kararı ve sonuç ayrıca gözlenir.
Current authorization command değerlendirmesinin girişinde kontrol edilir. Stored receipt’e bakmadan önce actor, action ve resource bağının halen uygun olduğu doğrulanır. Request-supplied price ve role işlem planına authority olarak alınmaz; server catalog/context’tan türetilir. Parametre eşleşmesi revision çatışmasını örtmez ve receipt’in varlığı permission yerine geçmez. Gerçek external effect gereken tasarım reconciliation ve durable delivery state’i ayrıca ele almalıdır.
Invariant’i outcome üzerinden sınamak
Başlangıç row’u available ve revision=7 durumundadır. Normal reserve, tek committed effect ile reserved ve revision=8 üretir. Aynı retained command tekrar değerlendirildiğinde effect sayısı bir kalır. Stale revision, eksik permission ve geri alınan başarısız operation için başlangıç row’u korunur, yeni receipt oluşmaz. Önceden başarılı command’a rağmen güncel permission reddedilmişse cached body dönmemelidir.
Bu sonuçlar sequential finite test kapsamındadır; gerçek contention, crash durability, multi-process scheduling ve external payment outcome hakkında kanıt sayılmaz. Animasyon gate’i local null adımla, ordinary command varışını receiver update ile ve committed receipt’i ayrı mesajla gösterir. Öğrencinin değerlendirmesi “hangi invariant korundu, authority nereden geldi, rollback veya commit gerçekten biliniyor mu?” sorularına dayanır. Invite, coupon ve recovery tabloları da aynı sorularla kendi purpose-specific guard’larını ister.
ŞİMDİ VAKAYA UYGULA
Tekrarlanan komut veya available state hangi koşulu tamamlayamaz?
copy-A reservation modeli güncel permission, revision ve effect sonucunu ayrı değerlendirir. Önceki effect ile yeni receipt teslimi aynı karar değildir.
Vakadaki accepted, delivery ve committed effect kayıtlarını farklı owner’lar üzerinden oku. Caller’ın bilinmeyen sonucunu business rollback olarak yeniden adlandırma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Conditional reservation ve receipt
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"resource": "copy-A",
"actor": "Duru",
"action": "reserve",
"initialState": "available",
"initialRevision": 7,
"capacity": 1,
"authoritativePriceUnits": 12,
"commandId": "reservation-A",
"quantity": 1,
"actualPayment": false,
"actualExternalEffect": false,
"actualParallelConcurrency": false
},
"rows": [
{
"case": "normal",
"label": [
"Reservation kabul",
"Reservation allow"
],
"currentPermissionDeclared": true,
"expectedRevision": 7,
"effectSucceededDeclared": true,
"expectedDispatch": true,
"expectedCommittedWrite": true,
"expectedReceiptDelivery": true,
"expectedBody": {
"reservationId": "reservation-A",
"resource": "copy-A",
"revision": 8
},
"expectedFinalState": "reserved",
"expectedFinalRevision": 8
},
{
"case": "stale-revision",
"label": [
"Revision eski",
"Revision stale"
],
"currentPermissionDeclared": true,
"expectedRevision": 6,
"effectSucceededDeclared": true,
"expectedDispatch": true,
"expectedCommittedWrite": false,
"expectedReceiptDelivery": false,
"expectedBody": null,
"expectedFinalState": "available",
"expectedFinalRevision": 7
},
{
"case": "permission-missing",
"label": [
"Permission eksik",
"Permission missing"
],
"currentPermissionDeclared": null,
"expectedRevision": 7,
"effectSucceededDeclared": true,
"expectedDispatch": false,
"expectedCommittedWrite": false,
"expectedReceiptDelivery": false,
"expectedBody": null,
"expectedFinalState": "available",
"expectedFinalRevision": 7
},
{
"case": "effect-failed",
"label": [
"Rollback kararı",
"Rollback decision"
],
"currentPermissionDeclared": true,
"expectedRevision": 7,
"effectSucceededDeclared": false,
"expectedDispatch": true,
"expectedCommittedWrite": false,
"expectedReceiptDelivery": false,
"expectedBody": null,
"expectedFinalState": "available",
"expectedFinalRevision": 7
}
],
"transitionTable": [
{
"before": "available",
"action": "reserve",
"guards": [
"current permission",
"quantity 1",
"remaining capacity 1",
"revision 7"
],
"after": "reserved",
"afterRevision": 8
},
{
"before": "reserved",
"action": "same command receipt",
"guards": [
"current permission",
"same actor/action/resource/parameters",
"retained command record"
],
"after": "reserved",
"afterRevision": 8
}
],
"authorityLedger": [
{
"field": "priceUnits",
"authority": "server catalog record",
"value": 12,
"callerAuthoritative": false
},
{
"field": "role",
"authority": "verified server actor context",
"value": "reader-reserver",
"callerAuthoritative": false
},
{
"field": "state",
"authority": "current reservation store",
"value": "available",
"callerAuthoritative": false
}
],
"idempotencyLedger": [
{
"operation": "first",
"currentPermission": true,
"sameBoundParameters": true,
"expectedEffects": 1,
"expectedReceipt": true
},
{
"operation": "same command retained",
"currentPermission": true,
"sameBoundParameters": true,
"expectedEffects": 1,
"expectedReceipt": true
},
{
"operation": "same command permission denied",
"currentPermission": false,
"sameBoundParameters": true,
"expectedEffects": 1,
"expectedReceipt": false
},
{
"operation": "same command different resource",
"currentPermission": true,
"sameBoundParameters": false,
"expectedEffects": 1,
"expectedReceipt": false
}
],
"flowFamilies": [
{
"flow": "invite",
"subject": "designated recipient",
"object": "workspace invitation",
"guards": [
"pending",
"unexpired",
"verified recipient"
],
"transition": "pending -> accepted"
},
{
"flow": "booking",
"subject": "authorized reserver",
"object": "owned catalog copy",
"guards": [
"current capacity",
"current revision",
"available"
],
"transition": "available -> reserved"
},
{
"flow": "coupon",
"subject": "eligible actor",
"object": "fictional benefit record",
"guards": [
"approved terms",
"remaining uses",
"valid period"
],
"transition": "eligible -> applied"
},
{
"flow": "recovery",
"subject": "account-bound verified recovery context",
"object": "recovery transaction",
"guards": [
"purpose bound",
"unexpired",
"unused"
],
"transition": "pending -> completed"
}
],
"failureLedger": [
{
"stage": "before dispatch",
"authorizationEvidence": null,
"commit": false,
"receipt": false
},
{
"stage": "controlled local transaction failure",
"authorizationEvidence": true,
"rollbackExecuted": true,
"commit": false,
"receipt": false
},
{
"stage": "external result absent (concept only)",
"authorizationEvidence": true,
"commitEvidence": null,
"receipt": false,
"automaticRetrySafe": false
}
],
"boundaries": {
"idempotencyKeyIsPermission": false,
"localTransactionMakesExternalEffectAtomic": false,
"sequenceTestProvesConcurrentIsolation": false
}
}- profile
- Fake copy, authoritative priceUnits, revision ve command kapsamı.
- rows
- Current permission/revision/effect evidence ve committed state/receipt sonucu.
- transitionTable
- Guarded state transition ve retained-command receipt ayrımı.
- authorityLedger
- Price/role/state için server-owned authority kaynakları.
- idempotencyLedger
- Bound command retry’da tek effect ve current authorization şartı.
- flowFamilies
- Invite/booking/coupon/recovery için purpose-specific guards.
- failureLedger
- Pre-dispatch ret, bilinen rollback ve unknown external commit ayrımı.
- boundaries
- Key possession, local transaction ve sequential testin kanıt sınırları.
Memory SQLite üzerinde sırayla değerlendirilen örnek reservation’lar. Gerçek contention, parallel race, payment, identity veya external effect davranışı gösterilmez.
İki yanlış kanı
Idempotency key permission kanıtıdır.
Retained command sonucu dönmeden önce current authorization gerekir; key yalnız bound command eşlemesidir.
Response gelmediyse write yapılmamıştır.
Commit kanıtı yoksa outcome unknown olabilir; bu fixture’daki açık rollback yalnız kendi local transaction’ını kanıtlar.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Revision=7 ve effect koşulu uygun, fakat currentPermissionDeclared=null. Reservation store’a dispatch yapılır mı?
- Hayır. Dispatch, write ve receipt yok.
- Evet. Doğru revision ve idempotency key bütün permission’ları sağlar.
Gerekçeli cevabı oku
Hayır. Dispatch, write ve receipt yok. — permission-missing satırı expectedDispatch=false ve expectedBody=null verir. Gerekli güncel permission kanıtı olmadan state değişmez.
Aynı command daha önce effect üretmiş. Güncel permission reddedilince neden expectedEffects=1 kalırken expectedReceipt=false?
Dersten seçilen artifact alanları; öğretim örneği
- idempotencyLedger[0]
- {"operation":"first","currentPermission":true,"sameBoundParameters":true,"expectedEffects":1,"expectedReceipt":true}
- idempotencyLedger[1]
- {"operation":"same command retained","currentPermission":true,"sameBoundParameters":true,"expectedEffects":1,"expectedReceipt":true}
- idempotencyLedger[2]
- {"operation":"same command permission denied","currentPermission":false,"sameBoundParameters":true,"expectedEffects":1,"expectedReceipt":false}
- Permission reddi önceki başarılı reservation’ı otomatik rollback eder.
- Eski effect geri alınmaz; yeni receipt teslimi durur.
Gerekçeli cevabı oku
Eski effect geri alınmaz; yeni receipt teslimi durur. — Dedupe state’i geçmiş effect’i korur. Aynı command kaydını bulmak, güncel izin olmadan receipt body’sini paylaşmaya izin vermez.
Stale revision ve effect-failed branch’lerinde state available/revision=7 kalıyor. Revision guard, transaction rollback ve external result unknown neden ayrı?
Gerekçeli cevabı oku
Stale revision, conditional write koşulunu sağlamaz. Effect failure için yerel transaction rollback edilir; başarı receipt’i verilmez. External result yoksa commit/effect sonucu bilinmeyebilir ve automatic retry güvenli varsayılamaz. Yerel transaction dış sistem effect’ini kendiliğinden atomic yapmaz. Bu reservation örneği gerçek payment veya parallel concurrency testi değildir. Server’ın price, role ve workflow state authority’si client alanlarıyla değiştirilmez.
□ Stale guard ile rollback ve unknown sonucu ayırdım.
□ Yerel transaction’dan external atomicity garantisi çıkarmadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP Business Logic SecurityAlways Re-derive Security-relevant Values on the Server / Prices and Totals; Permissions and Ownership; Identity and Role · Model Workflows Explicitly / Define and Enforce State Transitions · Prevent Race Conditions / Use Database Transactions and Locks: conditional update and affected rows; Use Idempotency Keys: authorization before cached result
- SQLite transaction documentation§2.1 Read transactions versus write transactions; §2.2 DEFERRED, IMMEDIATE and EXCLUSIVE · §3 Response To Errors Within A Transaction: explicit rollback and error scope
- OWASP Forgot PasswordIntroduction guidelines: single use, expiration and no account change before verified evidence · Methods / General Security Practices: bind to individual user and invalidate after use
- Python 3.14 sqlite3 documentationconnect: :memory:, isolation_level=None and LEGACY_TRANSACTION_CONTROL scope · Connection.in_transaction; Cursor.execute parameter binding; Cursor.rowcount; Transaction control via isolation_level