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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Commit note
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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üğü
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- Hayır. Bu örnekte explicit rollback gerekir.
- 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}
- Evet. Indexed search her workload’da latency’yi düşürür.
- 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
- Python 3.14 — sqlite3Tutorial · sqlite3.connect · Cursor.execute · How to use placeholders to bind values in SQL queries · Transaction control via the isolation_level attribute · How to use the connection context manager
- SQLite — Transaction2. Transactions · 2.1. Read transactions versus write transactions · 2.2. DEFERRED, IMMEDIATE, and EXCLUSIVE transactions · 2.3. Implicit versus explicit transactions
- SQLite — The ON CONFLICT ClauseABORT · ROLLBACK
- SQLite — Query Planning1.1. Tables Without Indices · 1.3. Lookup By Index · 1.5. Multiple AND-Connected WHERE-Clause Terms
- SQLAlchemy 2.0.54 — Session BasicsWhat does the Session do ? · Flushing · Committing · Rolling Back · Expiring / Refreshing
- SQLAlchemy 2.0.54 — Connection PoolingConnection Pooling · Connection Pool Configuration · Reset On Return · Custom Reset-on-Return Schemes