Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Senkronizasyonu Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Senkronizasyonu Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri Kayıt Senkronizasyonu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Senkronizasyon mekanizmasını kurmadan önce çalışma ortamınızı hazırlamanız gerekir. Bu eğitimde SQLite (yerel) ve PostgreSQL (merkezi) veritabanı ikilisi üzerinden örnekler vereceğiz. İhtiyacınız olan temel araçlar şunlardır:

  • PostgreSQL 16+ (Sunucu tarafı için).
  • SQLite 3.40+ (İstemci tarafı/yerel depolama için).
  • Node.js veya Python gibi bir backend çalışma zamanı.
  • Veri versiyonlama için zaman damgası (timestamp) veya UUID (evrensel benzersiz kimlik) kullanımı.

Ön hazırlık olarak, veritabanı tablolarınızda mutlaka bir updated_at (güncellenme zamanı) ve is_synced (senkronize edildi mi) sütunu bulundurmanız, izleme sürecini kolaylaştıracaktır.

Adım 1: Veri Değişikliklerini İzleme (Change Tracking)

Senkronizasyonun ilk adımı, hangi verinin değiştiğini tespit etmektir. Bunun için en güvenilir yöntem "Trigger" (tetikleyici) mekanizması veya uygulama katmanında bir "Dirty Flag" (kirli işaretleyici) kullanmaktır. Aşağıdaki SQL örneği, bir kayıt güncellendiğinde otomatik olarak versiyon numarasını artıran bir tetikleyiciyi göstermektedir.

CREATE OR REPLACE FUNCTION update_version_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.version = OLD.version + 1;
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_update_version
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_version_column();

Bu kod, users tablosundaki her güncelleme işleminde version sütununu otomatik artırır. Böylece sunucu, istemciden gelen verinin daha yeni olup olmadığını versiyon numarasına bakarak kolayca anlar.

Adım 2: Çakışma Çözüm Stratejileri

İki farklı kaynaktan aynı anda gelen veriler çakışmalara yol açar. En yaygın strateji "Last Write Wins" (Son yazan kazanır) veya "Client-Wins" yöntemidir. Aşağıdaki örnekte, sunucu tarafında bir kayıt güncellenirken versiyon kontrolü yaparak veri kaybını nasıl önlediğimizi görüyoruz.

-- Sunucu tarafında güvenli güncelleme
UPDATE users 
SET name = $1, version = version + 1
WHERE id = $2 AND version = $3; -- İstemcinin bildiği versiyon ile eşleşmeli

Bu sorguda, version = $3 kontrolü kritik öneme sahiptir. Eğer sunucudaki versiyon, istemcinin gönderdiğinden farklıysa, bu bir çakışma olduğu anlamına gelir ve güncelleme gerçekleşmez.

Güvenlik Uyarısı: SQL Injection saldırılarını önlemek için asla kullanıcıdan gelen veriyi doğrudan sorguya eklemeyin. Yukarıdaki örnekte olduğu gibi "Prepared Statements" (hazırlanmış ifadeler) kullanın.

Adım 3: Senkronizasyon Protokolü Tasarımı

Senkronizasyon işlemini bir dizi paket (batch) halinde yapmak performansı artırır. İstemci, sunucuya sadece last_sync_time değerinden sonra değişen verileri talep eden bir istek gönderir.

-- İstemcinin sunucudan yeni verileri çekmesi
SELECT * FROM users 
WHERE updated_at > '2026-05-20 10:00:00';

Bu sorgu, sadece belirtilen tarihten sonra güncellenen satırları döndürür. Bu yöntem, bant genişliği kullanımını minimize eder ve senkronizasyon süresini kısaltır.

Adım 4: Veri Gönderimi ve Onay Mekanizması

İstemci veriyi gönderdikten sonra sunucudan bir onay (ACK) almalıdır. Bu onay gelmeden veriyi yerel veritabanında "senkronize edildi" olarak işaretlememelisiniz.

// Örnek bir senkronizasyon fonksiyonu
async function syncData(localData) {
    try {
        const response = await fetch('/api/sync', {
            method: 'POST',
            body: JSON.stringify(localData)
        });
        if (response.ok) {
            await db.execute("UPDATE local_table SET is_synced = 1");
        }
    } catch (error) {
        console.error("Senkronizasyon başarısız:", error);
    }
}

Bu kod bloğu, verinin sunucuya başarıyla ulaştığını doğrular ve ardından yerel veritabanını günceller. Hata durumunda işlem durdurulur ve bir sonraki denemeye kadar veriler yerelde tutulur.

Adım 5: Yöntem Karşılaştırması

Veri senkronizasyonu için kullanabileceğiniz farklı yaklaşımların avantaj ve dezavantajları aşağıda özetlenmiştir.

Yöntem Avantaj Dezavantaj
Zaman Damgası Basit ve hızlıdır. Saat sapmalarına duyarlıdır.
Versiyon Numarası Çakışma tespiti kesin sonuç verir. Ek sütun yönetimi gerektirir.
İşlem Günlüğü (Log) Tüm geçmişi tutar. Depolama maliyeti yüksektir.

Adım 6: Hata Yönetimi ve Debug İpuçları

Senkronizasyon sırasında en sık karşılaşılan hata "Network Timeout" veya "Partial Sync" (kısmi senkronizasyon) durumlarıdır. İşlemleri her zaman bir "Transaction" (işlem bloğu) içerisinde yürütün.

BEGIN;
-- Tüm senkronizasyon adımları burada gerçekleşir
-- Hata oluşursa ROLLBACK ile geri alınır
COMMIT;

Hata ayıklarken, senkronizasyon loglarını bir dosyada veya veritabanında tutun. Hangi kaydın hangi aşamada başarısız olduğunu görmek, sorunu çözmenizi hızlandıracaktır.

Sorumluluk Reddi: Bu rehberde sunulan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanırken mutlaka veritabanı şifreleme, HTTPS kullanımı ve yetkilendirme (JWT vb.) gibi ek güvenlik katmanlarını entegre edin.

Sıkça Sorulan Sorular

Senkronizasyon sırasında internet koparsa ne olur?

Veriler yerel veritabanında "bekleyen" (pending) durumunda kalır. İnternet bağlantısı geri geldiğinde, uygulama otomatik olarak veya kullanıcı tetiklemesiyle kaldığı yerden devam eder.

Çakışma durumunda kullanıcıya ne gösterilmeli?

Kullanıcıya hangi verinin sunucuda, hangisinin yerelde olduğunu gösteren bir arayüz sunarak, hangi verinin korunması gerektiğini seçmesini sağlamak en iyi kullanıcı deneyimidir.

Tüm veritabanını mı senkronize etmeliyim?

Hayır, sadece değişen (delta) verileri senkronize etmek sistem performansını korumak için şarttır.

SQL Injection'dan nasıl korunurum?

Kullanıcıdan gelen her veriyi parametreli sorgular (prepared statements) kullanarak işleyin ve asla doğrudan SQL string'i oluşturmayın.

2026 yılı için en iyi yöntem hangisidir?

Versiyon numarası tabanlı senkronizasyon, günümüz sistemlerinde hata payı en düşük ve yönetimi en kolay yöntem olarak kabul edilmektedir.

Performans Optimizasyonu İçin Veri Gruplandırma (Batching)

Büyük ölçekli veritabanlarında tüm kayıtları tek bir seferde senkronize etmek, hem ağ trafiğini tıkar hem de veritabanı sunucusunda kilitlenmelere (locking) yol açar. Performansı artırmak için verileri küçük paketler halinde (batch) işlemelisiniz.

Aşağıdaki SQL örneği, henüz senkronize edilmemiş verileri belirli bir limit ile çekerek işlem yükünü nasıl bölebileceğinizi gösterir:

-- Performans odaklı batch çekme sorgusu
SELECT TOP 100 id, payload, version 
FROM SyncQueue 
WHERE is_synchronized = 0 
ORDER BY created_at ASC;

Bu yaklaşım, uygulamanızın "timeout" hatalarına düşmesini engeller ve sunucu kaynaklarının daha verimli kullanılmasını sağlar. Her başarılı batch işleminden sonra, ilgili kayıtları is_synchronized = 1 olarak işaretlemeyi unutmayın.

Senkronizasyon Süreçlerinde İleri Hata Ayıklama (Tracing)

Dağıtık sistemlerde senkronizasyon hatalarını bulmak oldukça zordur. Sorun giderme sürecini hızlandırmak için her senkronizasyon adımında bir "Audit Log" tablosu tutmak, sistemin nerede koptuğunu görmenizi sağlar.

Loglama Stratejisi

  • Request ID: Her senkronizasyon döngüsüne benzersiz bir UUID atayın.
  • Timestamp: İşlemin başlangıç ve bitiş süresini kaydedin.
  • Status Code: Başarılı olanlar için 200, hatalı olanlar için spesifik hata kodları (örn: 503, 409) kullanın.

Hata ayıklama sırasında veritabanı loglarını incelemek için şu sorgu yapısını kullanabilirsiniz:

-- Hata analizi için log sorgusu
SELECT request_id, error_message, affected_table, created_at 
FROM SyncAuditLogs 
WHERE status = 'FAILED' 
AND created_at > DATEADD(hour, -24, GETDATE());

Dağıtık Sistemlerde Transaction Yönetimi

Senkronizasyon sırasında veritabanı tutarlılığını korumak için BEGIN TRANSACTION ve COMMIT bloklarını kullanmak hayati önem taşır. Eğer bir kayıt başarılı olurken diğeri hata verirse, veritabanının "yarı güncel" kalmaması için tüm işlemi geri almanız (rollback) gerekir.

BEGIN TRY
    BEGIN TRANSACTION;
        -- Senkronizasyon işlemleri
        UPDATE LocalData SET status = 'SYNCED' WHERE id = @id;
        INSERT INTO SyncHistory (record_id, sync_date) VALUES (@id, GETDATE());
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    -- Hata detaylarını logla
    INSERT INTO ErrorLogs (msg) VALUES (ERROR_MESSAGE());
END CATCH;

Bu yapı, veritabanınızın her zaman atomik (ya hep ya hiç) bir yapıda kalmasını garanti altına alır.

Sonuç

Sql & veritabanı ile uygulamalar için veri kayıt senkronizasyonu, doğru planlandığında sistemin güvenilirliğini ciddi oranda artırır. Versiyon takibi, çakışma yönetimi ve işlem bütünlüğü (transaction) kullanarak verilerinizin her zaman güncel kalmasını sağlayabilirsiniz. Bir sonraki adım olarak, bu mantığı WebSocket teknolojisi ile birleştirerek "gerçek zamanlı" (real-time) senkronizasyon üzerine çalışmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Adım adım rehber hazırlama ve kullanıcı deneyimi odaklı içerik mimarisi konusunda yetkinim. Okuyucuların sorunlarını hızlı çözen, net ve uygulanabilir metinler üretmeyi seviyorum.

Yorumlar (0)

Yorum Yaz