Veritabanı Auto İd Kayması Problemini Nasıl Çözerim?
-
Problemimi genişçe anlatayım;
Zamanında bir üyelik sistemi yapmıştım, çok sivrizekalı olduğumdan dolayı sırf hücrelerden kâr edicem düşüncesiyle üyelik sistemini şu şekilde yapmıştım;
Kullanıcı siteye kayıt olurken tüm bilgileri;
insert into A tablosu
insert into B tablosu
insert into C tablosu
Şeklinde kayıt oluyor ve bu tabloların ID hücreleri primary key olarak üye idsi ile eşit şekilde seyrediyor. Yani bizim "7" idli üyecan nickli üyemizin bilgilerini A, B, C tablolarından id=7 şeklinde çektiriyorum ve kolayıma geliyordu..
----------------------
Şimdi asıl problem şu;
Anlık bir kesintide veya başka türlü sıkıntılarda B ve C tablosunun auto increment ayarı ileride gidiyor, A tablosu da geriden geliyor ve üyelik sistemi çakılıyor. Şimdi diyeceksiniz a bizim akıllı zombimiz aç tablolara birer uyeid hücresi, o şekilde yoluna devam et. Düşündüm, denedim bu sefer de aynı anda kayıt olmaya çalışan 2 üyenin zamanın bilmem kaçta kaçının kesişmesiyle beraber B ve C tablolarındaki üye bilgileri birbirine karışabiliyor. Senede bir kez anca meydana geliyor olsa bile canımı sıkıyor bu durum.
Bu sorunumu nasıl çözebilirim? -
Belirtmeyi unutmuşum veritabanı MySQL (innodb)
-
1-)Öncelikle A B ve C tablolarına üye id şeklinde UYELERIN ID lerini referans alan bir foreign key field'ı oluşturacaksın. Tablolarını organize edeceksin yeniden. Hataları düzelteceksin. Daha sonra;
Yöntem 1:Üyeleri kaydederken transaction kullanacaksın hocam. INNODB benim bildiğim transaction işlemlerini destekliyor. O yılda milyonda bir ihtimalde oluşan sorunlarıda bu şekilde iptal edeceksin. MYSQL de transaction kullanmadım ama internette muhtemel bi sürü örnek bulursun.
Gerçi hala anlamadım nasıl öyle bir sorun çıkabiliyor. Aynı anda bile üye olsalarda.Üyeler tablosuna eklediğin satırın id numarasını alıp o id numarasını A B C tablolarını oluştururken FIELD'e yazarak kullanacaksın.
Yöntem 2: Ayrıca 2. maddeyi iptal ederek; Her üye kayıt olurken (UYELER tablosuna) AFTER INSERT triggeri ile tetikleyici bağlayacaksın. Ve her üyenin A, B ve C satırlarını bu trigger içinde oluşturtacaksın ki, o yılda bir olan hata oluşmasın.
Düzeltme:Bazı kavramları yanlış yazmışım.
DrKill tarafından 02/May/14 04:23 tarihinde düzenlenmiştir -
stored procedures/transaction gibi şeylere bağlı kalmadan kısa yoldan kodlarla veya hücrelerle halletmek istiyorum hocam eğer çok zorda kalırsam dediğin gibi yapabilirim ama öncelik basitçe kod/hücre yumağıyla yapmak :D
+ up olsun
