Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-18.02

Query lifecycle, transactions ve ORM

Bound data ile SQL statement’ı ayır, query result’inden commit’e kadar ownership’i izle. Index, pool ve ORM bu lifecycle’ın farklı parçalarını düzenler.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Commit note

  1. Use case seçimi

    Application, Tea note başlığını Updated note yapmak ve audit row eklemek üzere use case’i seçer. Fixed statement ile bound data ayrı tutulur; henüz lease veya transaction başlamamıştır.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Lease yok
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  2. Connection sınırı

    Connection owner writer lease’ini kabul eder ve BEGIN uygular. SQLite writer ile independent reader ayrı connection’lardır; driver çağrıları yereldir, network paketi çizilmez.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  3. Pending write

    Title update writer transaction’ında görülür; execute success commit veya fresh reader visibility değildir.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Writer: Updated note; uncommitted
    Independent reader
    Tea note
  4. Reader ayrı

    Diğer connection SELECT’i bitirerek previous committed title’ı okur; long-lived read snapshot tutulmaz.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Writer: Updated note; uncommitted
    Independent reader
    Before commit: Tea note
  5. İkinci statement

    Audit statement geçerli row’u ekler. Writer Updated note ve audit=1 değerlerini kendi açık transaction’ında görür; reader’ın son gözlemi hâlâ Tea note’dur, commit henüz yoktur.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Audit valid; pending
    Independent reader
    Before commit: Tea note
  6. Transaction sonu

    Writer COMMIT uygular; Updated note ve audit=1 aynı transaction sonucunda kabul edilir. Independent reader henüz yeni SELECT yapmadığı için kartında önceki Tea note gözlemi korunur.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    COMMIT succeeded
    SQLite writer state
    Updated note; audit=1 committed
    Independent reader
    Before commit: Tea note
  7. Fresh read

    Reader yeni SELECT ile tamamlanmış transaction sonucunu okur; bu gözlem crash durability veya replica consistency değildir.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    COMMIT succeeded
    SQLite writer state
    Updated note; audit=1 committed
    Independent reader
    Fresh reader: Updated note
  8. Use case sonucu

    Application operation sonucunu kullanır; local result, ORM object ve response preparation farklı aşamalardır.

    Application
    Commit sonucu: Updated note; audit=1
    Connection owner
    COMMIT succeeded
    SQLite writer state
    Updated note; audit=1 committed
    Independent reader
    Fresh reader: Updated note

Rollback note

  1. Use case seçimi

    Application, Tea note başlığını Updated note yapmak ve audit row eklemek üzere use case’i seçer. Fixed statement ile bound data ayrı tutulur; henüz lease veya transaction başlamamıştır.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Lease yok
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  2. Connection sınırı

    Connection owner writer lease’ini kabul eder ve BEGIN uygular. SQLite writer ile independent reader ayrı connection’lardır; driver çağrıları yereldir, network paketi çizilmez.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  3. Pending write

    Title update writer transaction’ında görülür; execute success commit veya fresh reader visibility değildir.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Writer: Updated note; uncommitted
    Independent reader
    Tea note
  4. Reader ayrı

    Diğer connection SELECT’i bitirerek previous committed title’ı okur; long-lived read snapshot tutulmaz.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Writer: Updated note; uncommitted
    Independent reader
    Before commit: Tea note
  5. İkinci statement

    Audit insert NOT NULL IntegrityError verir. SQLite ABORT yalnız başarısız statement’ı geri alır; writerAfterError=Updated note ve transactionOpenAfterError=true kalır, audit row eklenmez.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Writer lease; BEGIN
    SQLite writer state
    Audit error; title still pending
    Independent reader
    Before commit: Tea note
  6. Transaction sonu

    Writer explicit ROLLBACK uygular; pending Updated note geri alınır ve transaction kapanır. Store state’i Tea note ve audit=0 olur; independent reader’ın yeni SELECT’i bir sonraki adımdadır.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Explicit ROLLBACK succeeded
    SQLite writer state
    Tea note; audit=0 korundu
    Independent reader
    Before commit: Tea note
  7. Fresh read

    Reader yeni SELECT ile tamamlanmış transaction sonucunu okur; bu gözlem crash durability veya replica consistency değildir.

    Application
    Tea note → Updated note + audit seçildi
    Connection owner
    Explicit ROLLBACK succeeded
    SQLite writer state
    Tea note; audit=0 korundu
    Independent reader
    Fresh reader: Tea note
  8. Use case sonucu

    Application operation sonucunu kullanır; local result, ORM object ve response preparation farklı aşamalardır.

    Application
    Rollback sonucu: Tea note; audit=0
    Connection owner
    Explicit ROLLBACK succeeded
    SQLite writer state
    Tea note; audit=0 korundu
    Independent reader
    Fresh reader: Tea note

Lease busy/reset

  1. Use case seçimi

    Application B, capacity=1 olan yerel adapter’dan lease almak ister. Checkout kararı query’den önce gelir; bu başlangıçta B’nin query sonucu veya empty-row gözlemi yoktur.

    Application
    B lease request; capacity=1 seçildi
    Connection owner
    Lease yok
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  2. Connection sınırı

    Tek slot A tarafından tutulmaktadır; B lease alamaz. Bu yerel busy kararı B için queryExecuted=false üretir; SQLite’da SELECT çalıştırılıp boş row dönmüş değildir.

    Application
    B lease request; capacity=1 seçildi
    Connection owner
    Lease A’da; B lease alamadı
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  3. Busy sonucu

    İkinci borrower lease alamadığı için query yapmaz; bu empty database result veya SQL error değildir.

    Application
    B query çalıştırmadı
    Connection owner
    Lease A’da; B lease alamadı
    SQLite writer state
    Tea note; audit=0
    Independent reader
    Tea note
  4. Pending lease write

    İlk borrower lease’i içinde BEGIN ve pending title update uygular; henüz commit veya başka borrower’a görünürlük yoktur.

    Application
    B query çalıştırmadı
    Connection owner
    Lease A’da; B lease alamadı
    SQLite writer state
    Pending lease note; uncommitted
    Independent reader
    Tea note
  5. Reset rollback

    İlk borrower’ın pending transaction’ı explicit rollback ile temizlenir; bu bütün backend-local resources’ın temizliği değildir.

    Application
    B query çalıştırmadı
    Connection owner
    Lease A’da; B lease alamadı
    SQLite writer state
    Pending title geri alındı
    Independent reader
    Tea note
  6. Lease döndür

    Pending transaction temizlendikten sonra connection yeniden kullanılabilir; örneğin capacity değeri production ayarı değildir.

    Application
    B query çalıştırmadı
    Connection owner
    Clean döndü; kullanılabilir
    SQLite writer state
    Pending title geri alındı
    Independent reader
    Tea note
  7. Sonraki read

    Connection temiz dönünce sonraki borrower lease alır ve yeni read ile Tea note görür. Bu adımda sağdaki read kartı next borrower’ın gözlemidir; önce lease alamayan B’nin read’i değildir.

    Application
    B query çalıştırmadı
    Connection owner
    Clean döndü; kullanılabilir
    SQLite writer state
    Pending title geri alındı
    Independent reader
    Next borrower: Tea note

ROLLER · STATE · VERİ AKIŞI

Statement, bound data ve result shape

SQL query lifecycle uygulamanın bir operation seçmesiyle başlar. Driver statement ve bound values’ı database’e verir; engine planı çalıştırır, cursor result row’larını uygulamaya taşır. SELECT id, title FROM notes WHERE title=? statement’ı sabittir; Tea note bir parameter value’dur. Placeholder value içindir: table/column adı veya SQL fragment seçimi aynı binding değildir. Dynamic identifier gerekiyorsa ayrı controlled selection sözleşmesi gerekir.

Cursor.execute query’yi yürütür; fetchone/fetchall result’i tüketir. Selected columns result shape’ini belirler, fakat row bulunması application permission kararı değildir. Örnek public notes kullanır ve title string’ini data olarak bağlar. Artifact statement text’i ile parameter tuple’ı ayrı alanlarda gösterir. Result’i application object’e map etmek engine’in göreviyle application policy’sini tek karar yapmaz.

Transaction’ın kararı statement success’ten büyüktür

Transaction birden çok değişikliğin tutarlılık sınırını tanımlar. Writer connection BEGIN sonrası note title update ve audit row insert yapar. COMMIT başarılı olduğunda fresh reader Updated note ile bir audit row görür. Writer’ın kendi uncommitted result’i başka connection’ın gördüğü committed state ile aynı değildir. Örneğin reader’ı her SELECT’i bitirir; long-lived read transaction tutmaz. Başka isolation veya journal seçimlerinde visibility sınırı farklı olabilir.

Rollback akışında önce title değişir; ardından NOT NULL audit koşulu örnekteki invalid data nedeniyle hata verir. SQLite’ın varsayılan ABORT davranışı failing statement’ın etkisini geri alır, daha önceki statement değişikliklerini bütün transaction’dan otomatik kaldırmaz. Writer explicit ROLLBACK uygular; sonraki reader Tea note ve 0 audit row görür. Error class veya update rowcount tek başına transaction’ın ended ya da committed olduğunu göstermez.

Disk örneğinde başarılı commit sonrasında connection yeniden açılıp aynı data okunur. Bu orderly reopen persistence’ını gösterir; power loss, storage corruption, replica failover veya bütün durability ayarlarını ölçmez. HTTP response preparation ile client arrival da farklı katmanlardır. SQLite çok sayıda reader’a rağmen aynı anda tek write transaction destekler; bütün database ürünlerinin concurrency semantics’i bu örneğe eşitlenmez.

Index, pool ve ORM’nin farklı sorumlulukları

Index query planner’a bir lookup seçeneği sunar; her query’nin onu kullanması veya hızlanması garanti değildir. SQLite örneğinde WHERE title=? planı index öncesinde scan, idx_notes_title eklendikten sonra indexed search gösterir. Result row’ları değişmez; süre veya throughput ölçülmez. Index storage ve write-maintenance maliyeti taşır; integrity, authorization veya commit’in yerine geçmez.

Connection pool fiziksel connection’ları request veya use case’ler arasında reuse eder. Checkout bir resource lease’tir; HTTP keep-alive ya da Browser session değildir. Capacity doluysa bounded wait/refuse policy gerekir. Connection dönerken uncommitted state temizlenir. SQLAlchemy reset-on-return buna bir örnektir, fakat her backend’de rollback bütün temporary/session kaynaklarını temizlemez. Dersin tek-slot lease adapter’ı explicit rollback kullanır; gerçek SQLAlchemy pool davranışını ölçmez.

ORM relational rows ile application objects arasında mapping ve unit-of-work düzeni sağlayabilir. SQLAlchemy Session identity map primary key başına object identity tutar. Object’in memory’de değişmesi, flush ile SQL gönderilmesi ve commit ayrı aşamalardır. Query veya lazy-load sırasında autoflush gerçekleşebilir; SQL’in başarıyla flush edilmesi commit değildir. Python DB-API örneği bu storage sınırını gösterir; ORM framework’ünün davranışı ayrıca değerlendirilir.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

ABORT ve rollback

  1. Writer transaction koşulu okundu

    Writer title’ı Tea note’dan Updated note’a çevirmiştir. Ardından audit statement NOT NULL constraint hatası verir; bu hata önceki başarılı statement’ın sonucunu otomatik silmiş sayılmaz.

    Writer/lease koşulları
    Writer: Updated note
    Transaction ve cleanup
    Audit: IntegrityError
    Consumer/borrower sınırı
    Cleanup pending
  2. ABORT scope’u ayrıldı

    rollback.failure ABORT statement scope tanımlar. transactionOpenAfterError=true ve writerAfterError=Updated note, transaction’ın hata sonrası hâlâ açık olduğunu gösterir.

    Writer/lease koşulları
    Statement failed
    Transaction ve cleanup
    Transaction still open
    Consumer/borrower sınırı
    Writer still sees update
  3. Error handling cleanup ile bağlandı

    Hata için HTTP error üretmek transaction cleanup kanıtı değildir. Artifact explicitRollback=true bildirir; bu ayrı operation pending değişikliği geri alır.

    Writer/lease koşulları
    Explicit rollback=true
    Transaction ve cleanup
    Pending write discarded
    Consumer/borrower sınırı
    Reader outcome pending
  4. Final reader state doğrulandı

    readerAfterRollback=Tea note ve auditRows=0’dır. Bilinen rollback sonucu writer’ın hata anında Updated note görmesiyle çelişmez; farklı zaman sınırlarıdır.

    Writer/lease koşulları
    Reader: Tea note
    Transaction ve cleanup
    Audit rows=0
    Consumer/borrower sınırı
    No committed update
  5. Connection sonraki borrower için ayrıldı

    Pool returnedAfterRollback=true ve transactionOpenOnReturn=false tutar. Cleanup olmadan connection’ı geri vermek sonraki işin transaction context’ini karıştırabilir.

    Writer/lease koşulları
    Rollback completed
    Transaction ve cleanup
    Transaction open=false on return
    Consumer/borrower sınırı
    Clean lease return
  6. Hata semantiği genellenmedi

    Bu sonuç seçilen SQLite ABORT ve explicit rollback akışıdır. Her error’ın aynı scope’ta geri aldığı veya başka database’lerin aynı exception API’sini verdiği varsayılmaz.

    Writer/lease koşulları
    Selected failure semantics
    Transaction ve cleanup
    Known cleanup result
    Consumer/borrower sınırı
    No universal rollback claim

Lease busy

  1. Pool kapasitesi seçildi

    Pool örneği capacity=1 olan yerel lease adapter’dır. Bu kapasite SQLAlchemy production pool ölçüsü değil, erişim boundary’sini göstermek için seçilen değerdir.

    Writer/lease koşulları
    Capacity=1
    Transaction ve cleanup
    Lease decision pending
    Consumer/borrower sınırı
    Query not started
  2. Busy acquisition kaydı incelendi

    busyAcquired=false bir connection lease’inin alınmadığını bildirir. Query yürütülmediği için bu branch’te database sonucu okunamaz.

    Writer/lease koşulları
    Busy acquired=false
    Transaction ve cleanup
    Query executed=false
    Consumer/borrower sınırı
    No result rows
  3. No-query empty-result sayılmadı

    busyQueryExecuted=false, SELECT çalışıp sıfır row bulması değildir. Lease admission sonucu ile query result ayrı tutulur.

    Writer/lease koşulları
    Lease denied
    Transaction ve cleanup
    Database not queried
    Consumer/borrower sınırı
    Empty database UNKNOWN
  4. Temiz return koşulu okundu

    returnedAfterRollback=true ve transactionOpenOnReturn=false vardır. Bir slotun yeniden kullanılabilir olması pending transaction’ın temizlenmesiyle birlikte değerlendirilir.

    Writer/lease koşulları
    Lease returned
    Transaction ve cleanup
    Transaction closed
    Consumer/borrower sınırı
    Next borrower pending
  5. Next borrower state’i eşleştirildi

    nextBorrowerTitle=Tea note olması selected rollback’tan sonraki state’i gösterir. Busy branch’in kendisi bu title’ı query sonucu olarak öğrenmiş sayılmaz.

    Writer/lease koşulları
    Busy branch: no query
    Transaction ve cleanup
    Next borrower: Tea note
    Consumer/borrower sınırı
    Observation contexts separate
  6. Pool abstraction scope’u korundu

    Bu lease sonucu gerçek pool contention, timeout süresi veya ORM autoflush kanıtı değildir. Her adapter’ın acquisition ve reset davranışı kendi contract’ıyla incelenir.

    Writer/lease koşulları
    Local lease boundary known
    Transaction ve cleanup
    ORM runtime unobserved
    Consumer/borrower sınırı
    No tuning claim

VARSAYIM · SINIR · KONTROL

Execution success, commit ve access policy

Fixed statement ile parameter values’ı ayrı oku. Tea note araması bir data comparison’dır; query yapısını seçme yetkisi değildir. Binding values’ın SQL structure yerine data olarak işlenmesine yardım eder, fakat hangi public/private resource’un seçilebileceğini veya object permission’ını tek başına belirlemez. Query kabulü ile application authorization farklı sınırlardır.

Writer updated title gördüğünde external reader’ın aynı state’i gördüğü varsayılmaz. Failing audit statement’dan sonra writer’ın updated title’ı hâlâ görmesi SQLite ABORT boundary’sini gösterir; explicit rollback sonunda iki connection’ın original state’te buluşması başka kanıttır. Olası hata transaction error’ını yalnız HTTP error body’ye çevirmek ve pending work’ü temizlememektir. Kontrol, outcome handling ile connection lifecycle’ın birlikte izlenmesidir.

Abstraction katmanı boundary’yi silmez

ORM object’in title property’si Updated note olmuşsa store commit kanıtı henüz yoktur. Flush, query, cache ve identity-map davranışı framework/configuration kapsamında okunur. Index planının değişmesi de result correctness veya production throughput sonucu değildir. Query sayısı ya da class adı yerine operation ve gözlenen boundary esas alınır.

Pool lease alamayan akışta query çalışmaz; bu empty database result değildir. Connection dönerken transaction state temizliği sonraki borrower için önemlidir. Örnekteki capacity=1 öğretim için seçilmiştir, production tuning önerisi değildir. Küçük adapter clean reuse’u gösterebilir; gerçek pool contention, timeout süresi, ORM autoflush veya concurrent transaction scheduling hakkında sonuç vermez.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Commit görünürlüğü

  1. İki connection observation’ı bağlandı

    writerBefore=Tea note ve writerDuring=Updated note’dur. readerBeforeCommit=Tea note ayrı connection’ın fresh read sonucudur; writer görüşü reader görüşü değildir.

    Connection observation
    Writer sees Updated note
    Transaction/plan review
    Reader sees Tea note
    Evidence conclusion
    Commit pending
  2. Commit sonrası read sınırı incelendi

    readerAfterCommit=Updated note kaydı commit sonrası yeni read’e aittir. Reader’ın önceki SELECT’i tüketilmiştir; long-lived snapshot için aynı sonuç varsayılmaz.

    Connection observation
    Fresh read after commit
    Transaction/plan review
    Reader: Updated note
    Evidence conclusion
    Audit review pending
  3. Audit record state ile bağlandı

    auditRowsAfterCommit=1 güncellenmiş title ile aynı kabul edilen transaction sonucuna bağlanır. Yalnız writerDuring değeri bu committed tuple’ın yerine geçmez.

    Connection observation
    Title committed
    Transaction/plan review
    Audit rows=1
    Evidence conclusion
    Commit tuple known
  4. Reopened read ayrı kanıt sayıldı

    reopenedTitle=Updated note, bağlantı yeniden açıldıktan sonra record’un okunabildiğini gösterir. powerLossTested=false olduğundan bu gözlem crash durability benchmark değildir.

    Connection observation
    Reopened: Updated note
    Transaction/plan review
    Power loss not tested
    Evidence conclusion
    Durability claim bounded
  5. ORM object değişimi commit olmadı

    orm.objectChangedIsCommit=false ve flushIsCommit=false’tur. Framework object state, flush ve database commit farklı sınırlar olarak değerlendirilir.

    Connection observation
    Object change ≠ commit
    Transaction/plan review
    Flush ≠ commit
    Evidence conclusion
    Framework execution separate
  6. Permission sonucu eklenmedi

    Fixed parameterized query Tea note değerini data olarak karşılaştırır. Commit visibility veya parameter binding, actor’ın object permission kontrolünü kanıtlamaz.

    Connection observation
    Query values separated
    Transaction/plan review
    Commit visibility known
    Evidence conclusion
    Permission unestablished

Plan ve cleanup

  1. Index plan karşılaştırması açıldı

    Index kaydı önce scan, sonra indexed search kategorisi bildirir. Plan kategorisi query’nin erişim yoludur; cevap data’sı veya geçen süre değildir.

    Connection observation
    Before: scan
    Transaction/plan review
    After: indexed search
    Evidence conclusion
    Result review pending
  2. Rows equality ayrı eşleştirildi

    resultRowsEqual=true aynı query’nin sonucunu korur. durationMeasured=false olduğu için index için hızlanma yüzdesi veya throughput sonucu verilmez.

    Connection observation
    Rows equal=true
    Transaction/plan review
    Duration measured=false
    Evidence conclusion
    No speed claim
  3. Lease cleanup condition okundu

    Selector returned=true ve transactionOpen=true olan lease observation’larını sayar. Index planı bu connection cleanup koşulunu doğrulayan alan değildir.

    Connection observation
    Returned + open is condition
    Transaction/plan review
    Plan ≠ cleanup evidence
    Evidence conclusion
    Selector review pending
  4. Negatif ve pozitif fixture ayrıldı

    Normal reset kaydında expected=0, inconsistent comparison’da positiveExpected=1’dir. Bu comparison gerçek kirli lease olayı değil, koşulun doğru ayrıldığını gösteren girdidir.

    Connection observation
    Normal expected=0
    Transaction/plan review
    Comparison expected=1
    Evidence conclusion
    Fixture distinction retained
  5. Missing observation temiz sayılmadı

    Lease kaydı veya transactionOpen alanı eksikse sıfır eşleşme temiz connection kanıtı değildir. Return, transaction state ve next borrower sonucu birlikte gerekir.

    Connection observation
    Missing record possible
    Transaction/plan review
    Cleanup UNKNOWN
    Evidence conclusion
    No clean conclusion
  6. Abstraction kanıtları ayrı korundu

    Plan correctness, rows equality ve connection reset üç ayrı gözlemdir. Plain sqlite3 sonucu, SQLAlchemy pool veya bütün backend-local resources cleanup’ı için proof olmaz.

    Connection observation
    Plan evidence bounded
    Transaction/plan review
    Lease evidence bounded
    Evidence conclusion
    Other resources unobserved

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Query ve transaction ledger’ini ayrı tut

Artifact query alanında statement, parameters=[Tea note] ve rows=[[1,Tea note]] bulunur. Normal transaction’da writerBefore=Tea note, writerDuring=Updated note, readerBeforeCommit=Tea note ve readerAfterCommit=Updated note ayrı tutulur. Reader SELECT’lerini tamamladığı için bunlar fresh-read görünürlüğünü anlatır; long-lived snapshot için aynı sonuç varsayılmaz.

Rollback ledger failing statement sonrasında transactionOpen=true ve writerAfterError=Updated note gösterir. ExplicitRollback=true ardından readerAfterRollback=Tea note ve auditRows=0 gözlenir. Bu field’ler örneğin observation şemasıdır; ürünün hazır log isimleri değildir. DB-API error class ilgili SQL state’e bağlanır; client’ın başarı yanıtı aldığı veya bütün durability koşullarının sağlandığı sonucu eklenmez.

Pool cleanup, index plan ve ORM sınırları

XPath count(/audit/lease[@returned="true" and @transactionOpen="true"]) transaction açıkken returned olmuş lease kayıtlarını sayar. Normal reset için 0, tutarsız returned state içeren kontrol kaydı için 1 verir. Busy akışında queryExecuted=false beklenen sonuçtur. Observation eksikken count=0 clean connection kanıtı değildir; gereken transaction state bilinmiyordur.

Index öncesi ve sonrasında result row’larıyla EXPLAIN QUERY PLAN birlikte karşılaştırılır. Plan text’i engine ve sürümüne bağlıdır; plan değişiminden ölçülmemiş hız sonucu çıkarılmaz. ORM’de memory mutation, flush ve commit ayrımı da korunur: SQLAlchemy Session’ın identity map’i object identity’yi tutar, transaction sonucunun yerine geçmez. Connection reset bu örnekteki pending transaction’ı temizler; bütün backend-local resources’ın temizlendiği anlamına gelmez. Driver, transaction, pool ve application outcome bu nedenle ayrı izlenir.

SQL statement’in yapısı uygulama tarafından seçilir, Tea note gibi data değerleri driver placeholder’larına ayrı bağlanır; query text’i data ile birleştirme. Placeholder tablo veya column seçme izni vermez: değişken identifier gerekiyorsa uygulamanın önceden belirlediği izinli seçim kullanılır. Transaction’ın başarı ve hata yolunu birlikte yaz: bütün gerekli adımlar tamamlanmadan commit etme, bu örnekte failing statement sonrası açık kalan transaction’ı rollback etmeden connection’ı yeni işe verme. Reset tamamlanamıyorsa temizlenmiş varsayarak reuse etme. Normal commit, explicit rollback ve busy nedeniyle hiç yürütülmeyen query ayrı doğrulanır; query sonucu veya pool state eksikse başarılı işlem kararı üretme.

ŞİMDİ VAKAYA UYGULA

Writer update gördüğünde hangi sonuç hâlâ kanıtlanmamıştır?

Tea note update’i commit, rollback ve lease return sınırlarıyla okunur. Index planı, ORM object state ve reader visibility tek success flag’ine indirgenmez.

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

Query, transaction ve lease outcome ledger

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "query": {
    "statement": "SELECT id, title FROM notes WHERE title=?",
    "parameters": [
      "Tea note"
    ],
    "rows": [
      [
        1,
        "Tea note"
      ]
    ],
    "identifiersBoundAsValues": false
  },
  "commit": {
    "writerBefore": "Tea note",
    "writerDuring": "Updated note",
    "readerBeforeCommit": "Tea note",
    "readerAfterCommit": "Updated note",
    "auditRowsAfterCommit": 1,
    "reopenedTitle": "Updated note",
    "powerLossTested": false
  },
  "rollback": {
    "writerAfterError": "Updated note",
    "transactionOpenAfterError": true,
    "explicitRollback": true,
    "readerAfterRollback": "Tea note",
    "auditRows": 0,
    "failure": "NOT NULL expected IntegrityError; ABORT statement scope"
  },
  "index": {
    "name": "idx_notes_title",
    "column": "title",
    "beforeCategory": "scan",
    "afterCategory": "indexed search",
    "resultRowsEqual": true,
    "durationMeasured": false
  },
  "pool": {
    "implementation": "own one-slot local lease adapter; not SQLAlchemy runtime",
    "capacity": 1,
    "busyAcquired": false,
    "busyQueryExecuted": false,
    "returnedAfterRollback": true,
    "transactionOpenOnReturn": false,
    "nextBorrowerTitle": "Tea note"
  },
  "orm": {
    "reference": "SQLAlchemy 2.0.54 documentation only",
    "objectChangedIsCommit": false,
    "flushIsCommit": false,
    "frameworkExecuted": false
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><lease returned=\"true\" transactionOpen=\"false\"/></audit>",
    "xpath": "count(/audit/lease[@returned=\"true\" and @transactionOpen=\"true\"])",
    "expected": 0,
    "positiveFixtureXml": "<audit><lease returned=\"true\" transactionOpen=\"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."
  }
}
query
Fixed SQL structure’dan ayrı bound data.
rollback
Statement ABORT ile explicit transaction rollback ayrımı.
pool
Öğretim kapasitesinde lease/reset; gerçek framework pool değil.

Örneğe ait SQLite file ve local adapter kullanılır. Orderly reopen gösterilir; crash, ORM, network/client response veya production pool ölçülmez.

İki yanlış kanı

Bir statement hata verdiğinde bütün transaction her zaman rollback olur.

SQLite default ABORT failing statement’ı geri alır; önceki work için selected transaction handling ve explicit rollback gerekir.

ORM flush veya updated object görülmesi commit demektir.

Object change, SQL flush ve commit ayrı aşamalardır; framework transaction boundary’sini ayrıca izle.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

NOT NULL hatasından sonra transactionOpen=true. Daha önce başarıyla yapılan update otomatik olarak rollback olmuş mudur?

  1. Hayır. Bu örnekte explicit rollback gerekir.
  2. Evet. Her database hatası bütün transaction’ı geri alır.
Gerekçeli cevabı oku

Hayır. Bu örnekte explicit rollback gerekir. — Hatanın ardından writer hâlâ Updated note değerini görebilir. explicitRollback=true sonrasında reader Tea note değerini görür ve auditRows=0 olur.

Query plan scan’den indexed search’e geçti. Sorgunun daha hızlı çalıştığı ölçülmüş müdür?

Dersten seçilen artifact alanları; öğretim örneği

index
{"name":"idx_notes_title","column":"title","beforeCategory":"scan","afterCategory":"indexed search","resultRowsEqual":true,"durationMeasured":false}
  1. Evet. Indexed search her workload’da latency’yi düşürür.
  2. Hayır. durationMeasured=false; dönen satırlar aynı.
Gerekçeli cevabı oku

Hayır. durationMeasured=false; dönen satırlar aynı. — Plan, index kullanılan erişim yolunu gösteriyor. Latency için aynı workload ve donanım koşullarında ayrıca süre ölçümü gerekir.

ORM nesnesini değiştirmek, flush etmek, database transaction’ını commit etmek ve connection’ı pool’a döndürmek neden ayrı işlemlerdir?

Gerekçeli cevabı oku

ORM nesnesini değiştirmek veya flush etmek, transaction’ın commit edildiği anlamına gelmez. Burada ORM davranışı belgelerden açıklanıyor; framework çalıştırılmıyor (frameworkExecuted=false). Database örneği commit sonrasında reader’ın gördüğü ve yeniden açılan kayıttaki başlığı gösterir; güç kaybı test edilmemiştir (powerLossTested=false). Connection pool’a dönerken açık transaction bırakmamalıdır. Kullanılan tek slotlu yerel adapter, gerçek SQLAlchemy pool çalışmasının kanıtı değildir.

□ Flush ile commit arasındaki farkı açıkladım.

□ Yerel connection reset örneğini gerçek ORM veya pool testi saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam