Kart Verilerini Sunucuda Çarpışmadan Saklamak
Kart Verilerini Sunucuda Çarpışmadan Saklamak
Geçiş kontrol sistemi kurarken karşılaştığım en sinir bozucu sorunlardan biri, aynı karttan yapılan iki okumayı veri tabanında iki kez kaydetmekti. Birisi kapıya kartını hızlı bir şekilde yaklaştırıyor, okuyucu bu işlemi iki defa algılıyor ve sistem bana "iki kere giriş yaptı" diyor. Sonra kullanıcı şikayet ediyor, ben de başını ağrıtan bir problemi çözmek için saatler harcıyorum.
Eğer siz de kendi başınıza bir sistem kuracaksanız, bu tür çarpışmalardan (duplicate) kaçınmak için hangi yöntemleri kullanabileceğinizi anlatmak istiyorum. Veri tabanı kart duplicate önleme konusu, aslında çok karmaşık değil—sadece doğru stratejiye ihtiyacınız var.
1. Zaman Penceresi Yöntemi ile Koruma
En basit ve en yaygın yöntemi ben de ilk başta uyguladım: zaman penceresi oluşturmak. Sistem bir kartı okuduğunda, aynı kart için belirli bir süre (mesela 2-3 saniye) içerisinde gelen okumayı otomatik olarak reddeder.
Teknik olarak şu şekilde çalışır: Veritabanında her kart okumısının kaydı alınırken, son okuma zamanı tutulur. Yeni bir okuma geldiğinde, sistem o kartın son kaydı ile şimdiki zaman arasındaki farkı kontrol eder. Eğer 2 saniyeden az ise, gelen komutu yok sayar.
Bu yöntemi uygulamak için sunucu tarafında basit bir kontrol yeterlidir. Ben genellikle Unix timestamp kullanarak karşılaştırma yapıyorum, çünkü timestamp karşılaştırması hızlı ve güvenilirdir. Zaman penceresi değerini (ben 2-3 saniye öneriyorum) kendi ihtiyacınıza göre ayarlayabilirsiniz.
2. Benzersiz İşlem Kimliği (Transaction ID) Stratejisi
Bir adım ileri gitmek istiyorsanız, her okuma işlemine benzersiz bir kimlik atayabilirsiniz. Okuyucu ile sunucu arasındaki her iletişimde, okuyucu bu işleme bir hash değeri veya sıra numarası ekler. Sunucu, aynı hash değeri ile gelen işlemi bir kez kaydeder, ikinci gelişi otomatik olarak reddeder.
Bu yöntem özellikle ağ gecikmelerinin yaşandığı ortamlarda işe yarar. Okuyucu sunucuya "Bu işlem sıra 12345'tir" diyebilir. Sunucu sıra 12345'i veritabanında görüyorsa, aynı sıra numarası ile gelen tekrar işlemi kabul etmez.
3. Veritabanı Seviyesinde Kısıtlama ve Index Kullanımı
Veri tabanı kart duplicate önleme konusunda en güvenilir yaklaşım, veritabanı motor tarafından yönetilen bir kısıtlama kullanmaktır. Tablomuza bir UNIQUE constraint (benzersizlik sınırlaması) ekleyebilirim, ancak burada dikkatli olmak gerekir.
Doğru yapı şöyledir: Tablo içinde kart numarası, okuma tarihi-saati ve bir sıra kimliğini birlikte ele alıp, bu kombinasyon için bir UNIQUE constraint oluştururum. Böylece veritabanı seviyesinde, tam olarak aynı anlık değer ile iki kayıt engellenmiş olur.
Ayrıca kart numarası ve tarih-saat kombinasyonunda bir INDEX oluşturmak, sorguların hızlanmasına yardımcı olur. Ben genellikle (card_id, read_timestamp) şeklinde composite index kullanıyorum.
4. Uygulama Seviyesinde Duplicate Kontrolü
Sunucu yazılımında, yeni bir kart okuma kaydını veritabanına eklemeden önce kontrol yapabilirim. Son 5 saniye içerisinde aynı kart tarafından bir okuma var mı diye sorgulanır. Varsa, bu yeni okuma kaydedilmez.
Bu yöntemi kullanırken dikkat edilmesi gereken nokta, veritabanı sorgusunun performanslı olması gerektiğidir. Çünkü her kart okumada bu kontrol yapılacak ve sistem yavaşlamamalıdır. İyi tasarlanan index ile bu sorun ortadan kalkacaktır.
5. Okuyucu Firmware Seviyesinde Çözüm
Bazı modern okuyucuların kendileri de duplicate okumayı engelleme özelliğine sahiptir. Cihazın ayarlarında "Anti-tamper" veya "Debounce delay" gibi seçenekler bulabilirsiniz. Bu sayede okuyucu seviyesinde zaten ilk filtreleme yapılır ve sunucuya yanlış veri ulaşmaz.
Okuyucunuzun kullanım kılavuzunu incelemek, bu tür ayarların olup olmadığını görmek için faydalı olacaktır.
Sık Yapılan Hatalar
- Zaman penceresi çok kısa belirlemek: 500 milisaniye gibi çok kısa süreler kullanırsanız, meşru okumalar da reddedilebilir. 2-3 saniye genellikle güvenli bir aralıktır.
- Hem sunucu hem de okuyucu tarafında aynı kontrolü yapmak ve senkronizasyon problemi yaşamak: Kontrol mekanizmasını tek bir yerde (tercihen sunucu) toplamak daha düzenli olur.
- Tarih-saat senkronizasyon sorunları: Okuyucu ve sunucu saati uyuşmuyorsa, zaman penceresine dayalı yöntemler başarısız olur. NTP (Network Time Protocol) kullanarak saat uyumlaştırması yapın.
- Kontrol mantığını test etmeden canlıya almak: Laboratuarda, kasıtlı olarak hızlı kartlama yaparak sistemi test etmek gerekir. Gerçek dünyadaki sorunlar bu şekilde bulunur.
Özet
Veri tabanında kart duplicate kaydını engellemek için tek bir "doğru yöntem" yoktur. İhtiyacınıza göre kombinasyon yapabilirsiniz: Basit bir sistem için zaman penceresi yeterlidir, daha güvenilir bir yapı için veri tabanı kısıtlamaları ekleyin. En iyi pratik, sunucu uygulama seviyesinde kontrol yapmak ve veritabanı motor tarafından da desteklenmesidir. Bu iki katmanlı savunma, çoğu durumdaki sorunları çözer ve kart okuma işlemlerinin temiz kalmasını sağlar.