Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-16.S05

Business invariants ve workflow state machines

Domain kararını state, authority ve effect sonucu üzerinden okumak.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Reservation kabul

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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ı

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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ı
  2. 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
  3. İ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
  4. 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
  5. 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
  6. 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

  1. 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ı
  2. 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
  3. İ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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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ı
  3. 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
  4. 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
  5. 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
  6. İ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

  1. 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
  2. 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
  3. 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ı
  4. 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
  5. 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
  6. 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ı?

  1. Hayır. Dispatch, write ve receipt yok.
  2. 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}
  1. Permission reddi önceki başarılı reservation’ı otomatik rollback eder.
  2. 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