İlişkisel veritabanlarında ACID ilkelerine ve isolation level ayarlarına güveniriz. “Repeatable Read seviyesindeysem aynı transaction içinde okuduğum veri değişmez, dolayısıyla güvendeyim” diye düşünebilirsiniz. Ancak ortada çok kritik bir yanılsama var: Write Skew (Yazma Eğriliği).
Write Skew; iki farklı eşzamanlı (concurrent) transaction’ın, aynı veri kümesini okuyup, birbirlerinin okuduğu veriyi doğrudan değiştirmeden, iş kuralını (business rule) ihlal edecek şekilde farklı satırları güncellemesiyle ortaya çıkar. Her iki transaction da kendi pencerelerinden bakıldığında tamamen geçerli işlemler yapar; fakat ikisi de COMMIT edildiğinde veritabanı tutarsız bir duruma düşer.
Bu yazıda, bu durumu klasik “Nöbetçi Doktorlar” (Doctors on Call) problemi üzerinden Docker ortamında PostgreSQL 18 kullanarak bizzat deneyimleyeceğiz.
1. Hands-On Lab: Docker & Environment Setup
Geliştirme ortamımızda durumu birebir canlı test edebilmek için bir docker-compose.yml ve opsiyonel Dockerfile hazırlayalım. Sistemimizde PostgreSQL 18 ve kolay SQL koşturabilmek/izleyebilmek için Adminer kullanacağız.
version: '3.8'
services:
postgres:
image: postgres:18-alpine
container_name: pg18_write_skew_demo
environment:
POSTGRES_USER: app_user
POSTGRES_PASSWORD: app_password
POSTGRES_DB: clinic_db
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
adminer:
image: adminer:latest
container_name: adminer_demo
ports:
- "8080:8080"
depends_on:
- postgres
volumes:
pgdata: