Bir eşzamanlı yazmaya neden bir SQLite veritabanında izin verilmiyor?


79

SQLite ile Java kullanarak veritabanı programlama yapıyorum.

Veritabanına bir seferde yalnızca bir bağlantının yazma yeteneğine sahip olduğunu, aynı anda birçok bağlantının okuma yeteneğine sahip olduğunu buldum.

SQLite mimarisi neden böyle tasarlandı? Yazılan iki şey veritabanındaki aynı yere yazılmadığı sürece, neden iki yazma aynı anda gerçekleşemiyor?



5
Çünkü SQLite "lite" olarak tasarlandı. Düşük bellek ve performans ile düşük işleme. SQLite'ın aynı dosyaya birden fazla yazma işlemi yapmasını nasıl sağlayacağınızı düşünün. Mevcut tasarımın uygulanması kolaydır - dosyanın tamamı kilitlidir ve diğerleri beklemek zorundadır. Yazma eşzamanlılığını daha düşük bir ayrıntı düzeyi düzeyinde işlemek için RDMS'lerden aldığınız satır / sayfa kilitlemesi gerekir. Gereksinim talepleri eşzamanlılık yazıyorsa, SQLite aday değildir ve bunun yerine hafif RDBMS'ye bakmalısınız: en.wikipedia.org/wiki/…
Thomas Carlisle

Yanıtlar:


157

Çünkü "birden fazla eşzamanlı yazma", çekirdek veritabanı motorunda başarılı olmak için tek yazarlı, çoklu okuyucudan çok daha zordur. Bu, SQLite'ın tasarım parametrelerinin ötesindedir ve dahil olmak üzere, SQLite'ın nefis derecede küçük boyutu ve sadeliğini altüst eder.

Yüksek düzeyde yazma eşzamanlılığını desteklemek, DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL ve Sybase gibi büyük veritabanı motorlarının bir özelliğidir. Ancak, kapsamlı eşzamanlılık kontrolü ve veritabanı, tablo ve satır kilitleme gibi optimizasyon stratejileri veya daha modern uygulamalarda, çoklu sürüm eşzamanlılık kontrolü gerektiren teknik olarak zor . Bu problem / gereksinim üzerine yapılan araştırma hacimlidir ve on yıllar öncesine dayanır .

SQLite, birden çok yazarı destekleyen sunucu merkezli DBMS'lerin çoğundan çok farklı bir tasarım felsefesine sahiptir. SQL ve ilişkisel modelin gücünü bireysel uygulamalara getirmek ve her uygulamanın içine yerleştirilmek üzere tasarlanmıştır. Bu hedef önemli değişimler gerektiriyor. Aynı anda birden fazla yazarın işleyebilmesi için gereken önemli altyapı ve ek yükü eklememek bunlardan biridir.

Felsefe, SQLite'ın uygun kullanım sayfasındaki bir ifadeyle özetlenebilir :

SQLite, istemci / sunucu veritabanlarıyla rekabet etmiyor. SQLite fopen () ile rekabet eder.


41
+1. SQLite bir süreç veritabanıdır. Sunucu tabanlı bir DB'de olduğu gibi merkezi bir hakem yoktur. Yazarların doğrudan işbirliği yapması ve birbirleriyle güvenmesi gerekirdi. Tek bir kötü niyetli yazar, işbirliği yapmamaya yol açabilir.
Jörg W Mittag

12
Ayrıca, SQLite'ın yürüttüğü ortamların bazıları birden fazla işlemi desteklemeyebilir.
david25272,

1
Muhtemelen kötü niyetli bir yazı, işbirliği yapmamaktan dolayı zaten hasara yol açabilir. Bunu yapmak için SQLite kodunu kullanamazlar, ancak kendi kodlarına sahip olabilirler, bu sadece unlink ()
bdsl çağrısı

12
Eşzamanlı uygulamalarda, çok fazla orta yol yoktur. Zorlu koşullar ve son durumlar da dahil olmak üzere, zaman zaman% 100'lük eşzamanlılık, tutarlılık ve veri bütünlüğü alıyorsunuz ya da almıyorsunuz. Yapmazsanız, kırılgan, yavaş ve çarpışma eğilimlidir ve insanlar buna çok hızlı bir şekilde güvenmeyi bırakır. Ancak bunu rutin olarak doğru bir şekilde yapmak son derece zordur. Yazarların, çekirdek desteğinin omurgası bulunmadığı durumlarda, harmanlanmış yazıları kendi başlarına koordine edebileceği pek fazla durum yoktur.
Jonathan Eunice

8
herhangi bir tür @bdsl Veritabanları yazarları üstlenmek zorunda olmayacak onlar verileri kaybetmemeniz için uslu ol. Yazarlar SQLite bunu rakip olarak konumlandırıyorlar fopen(), bu yüzden eşzamanlı yazı ile birlikte gelen tüm tüylülükleri düz bir metin dosyasına düşünün.
Blrfl,

12

Çünkü bir şeylerin aynı yere yazılıp yazılmayacağını söyleyen hiçbir sunucu yoktur. Bir dosyaya yazmaya çalışan sadece iki işlem var.

Bir yorumda işaret edildiği gibi, eşzamanlı yazmalara ayrıca bir iç iş parçacığı da desteklenebilir. Bunun ne kadar işe yarayacağından emin değilim (bu konuda da pek düşünmedim). Her neyse, bu yüzden SQLite konu kullanmıyor: Dr Hipp bu konuların kötü olduğunu düşünüyor.

DR Hipp'in ipliklerin kötü olduğunu düşündüğü SQLite SSS belgesinde belgelenmiştir .


2
Bu, eşzamanlı yazılara neden izin verilmediğinin teknik nedenini açıklar, ancak tasarım kararının neden verilmediğini açıklar.
Robert Harvey

3
SQLite tasarlama kararı, bir seferde yalnızca bir yazı yazabilmesi için.
Robert Harvey

7
@ Goyo bir sunucu eşzamanlı yazma işlemek için gerekli değildir: bir veritabanı sunucusu ayrı bir işlem olduğu sürece, aynı amaca hizmet eden SQLite için ayrı bir iş parçacığı olabilir. Robert Harvey haklı: SQLite ekibi tarafından verilen bir tasarım kararı vardı ve aynı anda tek bir kütüphanenin eşzamanlı yazma işlemlerini yapabilme yeteneğiyle ilgisi yok (çünkü teoride yapabiliyor).

1
Bu cevap bana iyi geliyor. Eşzamanlı yazma işlemlerini yürütmek için, birinin bir sunucuya veya çok iş parçacıklı bir sqlite uygulamasına sahip olması gerekir. Her ikisi de diğer tasarım kararları tarafından dışlandığından, eşzamanlı yazmaların uygulanması son derece zor olacaktır.
jpa

5
@jpa: SQLite, zaten bir "sunucu" olmadan birkaç işlem / konu arasında kilitlemeyi senkronize etmeyi yönetir. Bir "sunucu" gerekli değildir - işletim sistemi tarafından sağlanan kilitleme / senkronizasyon / IPC / kullanılması yeterlidir, ancak çok hızlı bir şekilde karmaşık hale gelir. Yayında belirtilen "iç iş parçacığı" mantıklı değil.
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.