Birden fazla kullanıcının bağlanıp sorgu, kayıt, veri çekme gibi farklı işler yapabileceği bir programda sqlite3 dosyasının maruz kalacağı bir sıkıntı olabilir mi?
Örneğin iki kullanıcı aynı anda sqlite3 dosyasına bağlanmayı denediğin de birinden birine bir hata verir mi? Aynı anda kayıt yapmaya çalıştıklarında birinin kaydını yaparken diğerinin kaydına ne olur?
Kısaca sorum şu;
sqlite3 dosyasına birden fazla bağlantı, sorgu, kayıt tarzı işlemler yapıldığı zaman karşılaşılacak sorunlar nelerdir?
Ya da alternatif olarak önereceğiniz farklı bir veritabanı modülümüz mevcut mu?
Not: Bahsettiğim şeyleri öğrenmek için deneme-yanılma yoluna başvuracak imkanlara sahip olmadığım bir alan ve zaman içerisindeyim. Bundan dolayı beyin fırtınası yaparsak başlangıç için iyi olacağını düşündüm.
SQLite veritabanı, kendi sitesinde yazdığına göre aynı anda sınırsız sayıda kullanıcının okumasına izin verirken, yazmak için o anda yalnızca bir kullanıcıya izin veriyor. Birisi veritabanına kayıt yaparken, bir başka kişi veritabanına kayıt yapmaya kalkarsa sqlite3.OperationalError: database is locked hatası alır. Ya da aynı şekilde aynı programda bir thread kayıt yaparken, diğer thread kayıt yapmaya kalkarsa aynı hatayı alır.
evet bu hata daha önce de karşılaştığım bir durumdu. Aslında kullanıcıların kayıt yapacağı an birbirleri ile denk gelme ihtimalleri çok düşük olacak. Yine de riske girmeye gerek yok. Ya da bunun için bir koşul durumu oluşturulabilir. Çözümlerim ilkel düzeyde.
Birden fazla kullanıcı dosyaya nasıl bağlanıyor? Tek thread içinde birden fazla dosya nesnesi ile mi, birden fazla thread’da tek dosya nesnesi ile mi, farklı process veya uygulamalardan mı?
@EkremDincel
10 tane bilgisayarın olduğu bir ortamda hepsinin ortak bağlandığı bir depolama alanı mevcut. Bu depolama alanı her bilgisayar tarafından aynı konum bilgisine sahip.
10 tane bilgisayarda aynı kodlara sahip 10 tane aynı program mevcut. Bu programa girişler sabit değil. Herkes kendi kullanıcı isimleri ile giriş yapıyor. 10 program açılıyor ve çalışıyor.
Programlar açılıyor ve çalışıyor fakat her saniye veritabanına bağlı olarak çalışmıyor. Sadece sorgu yapacağı an bağlanıp çalışıyor ve bu da toplamda 2 saniye kadar sürüyor. Ardından hemen bağlantıyı kapatıyor. Böylelikle çok kısa sürede işini hallediyor ve veritabanından çıkış yapıyor.
Birden fazla uygulamanın bir dosyayı aynı anda açabiliyor olup olmaması işletim sistemine bağlı. Siz bir de birden fazla bilgisayarın ortak bir depolama donanımına bağlı olduğunu söylüyorsunuz. Öyleyse konu bu bağlantının nasıl yapıldığı ve nelere izin verdiği ile de alakalı, kütüphanenin veya dilin neyi desteklediğinden ibaret değil.
Bahsettiğiniz sorunlarla uğraşmamak için zaten DBMS(veritabanı yönetim sistemleri) denilen sistemler geliştirilmiştir. O yüzden SQLite yerine client-server şeklinde kullanılabilen bir sistemle çalışın, mesela MySQL gibi.
Bu yöntem bana pek sağlıklı gelmedi. sqlite3.OperationalError hatasının yükselebileceği bir durum olarak aklıma sadece birden fazla thread’dan aynı bağlantının kullanılması geliyor, onda da lock veya queue gibi yapılar kullanılmalı.
ben bahsettiğim programın o aşamasını bir kurup deneyeceğim. İhtiyaçlarımı görebilecek bir seviyede olursa aynı şekilde devam ederim. Yok olmazsa çözüm için arayışlara tekrar başlarım. sqlite3 ve mysql’i deneyeceğim.