2011-01-28 14 views
18

Şu anda bir MySQL veritabanı çalıştırıyorum. Tüm masalarım, Table Engine InnoDB kullanıyor.MySQL eşzamanlılık, nasıl çalışır ve uygulamada kullanmam gerekir

Uygulamamda oturum açan herkes kayıtları görüntüleyebilir ve bir noktada iki kullanıcının aynı anda bir kaydı güncelleyebileceği veya ekleyeceği konusunda endişeliyim. MySQL bu tür bir eşzamanlılık sorununu hassas bir şekilde ele alıyor mu, yoksa koduma programlamak zorunda kalacağım bir şey mi?

Koduma programlamak zorunda kalırsam, böyle bir eşzamanlılık durumunu nasıl ele alırsınız?

+0

Bunlara dikkat etmeniz gerekmez. Modern günümüz Veritabanları eşzamanlılık kontrolünde yeterince akıllıdır :) – Tauquir

+0

Bu ne demek istediğimi anladım ben sadece kontrol etmek için – medium

cevap

20

SQL deyimleri atomiktir.

UPDATE Cars SET Sold = Sold + 1 

kimse bu ifadeye sırasında Sold değişkeni değiştirebilirsiniz: Böyle bir şey yürütmek Yani, eğer. Aynı ifadeyi aynı anda yürütse bile, her zaman 1 oranında artar. Eğer birbirlerine bağlıdır ifadeleri varsa

sorun oluşur: bu sorguları Arasında

a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 

, başka bir kullanıcı Satılan tablo Otomobil ve güncelleştirme değiştirebilir. Bunu engellemek için, bir işlem içinde sar:

BEGIN; 
a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 
COMMIT; 

İşlemleri MyISAM tarafından InnoDB tarafından desteklenen, ancak zorunlu değildir.

+2

bu açıklama için teşekkür ederim. – medium

+2

Bir işlemde bile garanti yoktur. MySQL varsayılan olarak, satır içi kilitleme/tablo kilitleme işlemlerinde bile sadece yazma işlemleri için yapar. ** a ** doğru bir değere sahip olmak için, SELECT'te * FOR UPDATE * komutunu koymak veya TRANSACTION üzerinde * SERİLEŞİLEBİLİR * gibi daha yüksek bir yalıtım düzeyi * belirtmek gerekir. ** Daha fazla bilgi: ** [Dahili kilitleme] (https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html), [Yalıtım seviyeleri] (https: //dev.mysql .com/doc/refman/5.6/tr/innodb-transaction-isolation-levels.html), [Okumaları Okuyor] (https://dev.mysql.com/doc/refman/5.6/en/innodb-locking- reads.html) –

İlgili konular