~/ blog

Write Skew : Hata vermeden çöken sistemin anatomisi

COMMIT komutları sorunsuz çalıştı, kilitlenmiş bir satır bile yok ama günün sonunda veritabanı tutarsızlığa düştü. Olay yeri inceleme tadında Write Skew anomalisini ve PostgreSQL’in davranışı üzerine hands-on bir gözlem yapıyoruz.


İ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.

docker-compose.yml
YAML
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: