Işlemleri daha verimli bir yöntem var mı?

6 Cevap php
insert into table1 ...;
update table2 set count=count+1;

Yukarıdaki ekler table1 içine bir şey, ve eğer başarılı olursa, bir count alanını günceller table2.

Tabii ki bu tür bir şey işlemleri ile ele alınabilir, ancak işlemler yüksek eşzamanlı sisteminde verimli olmayacağını, hangi tabloyu kilitlemek gerekir. Eğer bu işlemde birden fazla tablo güncellemeniz gerekiyorsa Ve daha da kötü olabilir.

Çözüm nedir?

Ben PHP kullanarak yapıyorum ve işlemler bu şekilde uygulanması:

mysql_query('begin');

mysql_query($statement1);

mysql_query($statement2);
...
mysql_query('commit');

Bu yüzden bu $statement kilitli olacak atıfta tüm tablolar gibi görünüyor?

6 Cevap

(MySQL varsayar bağlamında InnoDB) tüm tabloyu kilitlemek gerek olmayacak bir işlem.

INSERT boşluk olmadan kilitleri tek tek satır kilitlenir.

Eğer WHERE fıkrasında dizinlenmiş bir alanda bir eşitlik veya IN koşulunu sağlamak ise UPDATE de herhangi bir boşluk kilit olmaz.

Bu, aynı satır etkiler, UPDATEs sadece birbirlerini bloke ederken bir şekilde dizin tablosu ile, INSERTs, birbirlerini engellemez anlamına gelir.

UPDATE Tabii bu etkiler tek satır kilidi olacak, ancak sizin işlem son işlem olduğundan işlem taahhüt sonra, kilidi derhal kalkacak.

Kilitleme kendisi iki eşzamanlı güncelleştirme sekans sayılarını artırmak, böylece gerekli aslında.

InnoDB depolama motoru kullanın. Bu satır düzeyinde kilitleme yerine tablo düzeyi kilitleme olduğunu MyISAM.

İşlemler mutlaka bütün tablo için bir kilit talep etmeyecektir.

Buna ek olarak, InnoDB farklı kilitleme stratejileri kullanarak çeşitli çeviri izolasyon seviyelerini destekler. Sen kontrol etmek isteyebilirsiniz:

Bu daha çok benim için bir "Tetikleyiciler" bir iş gibi görünüyor. bir şey yapmak OnInsert.

İşlemler bir "ya hep ya hiç" davranışı sağlamak için büyük - sisteminizde yüksek yük veya yüksek eşzamanlılık olsa bile, sen işlemleri kullanarak durdurmak gerekir, sen tutarlı kalmak için verileri gerekir eğer en azından!

(And transactions will not necessarily lock the whole table(s))

Hız mutlak özü olsaydı, ben (iş parçacığı güvenli kodu kullanarak) bellekte güncelleştirme sayısını önbelleğe ve sadece periyodik veritabanına geri yazmak için cazip olabilir. Ben öyle yaptım ben kesinlikle bir işlem kullanmak istiyorsunuz. Bunun dezavantajı, sadece yaklaşık olarak sayılmasını tedavisi için istekli olması gerekir olduğunu. Eğer bir operasyon için kesinlikle doğru olmak gerekirse, o zaman bir işlem içinde yine, yeniden hesaplanması gerekir.

Diğerleri satır düzeyinde kilitleme ve sadece işlem muhtemelen daha kolay (bir tetikleyici vasıtasıyla veya örtülü) bir açık kullanılarak destekleyen bir veritabanı kullanarak, işaret gibi. Kesinlikle daha doğru ve güvenli.