Mysql eşzamanlı istekleri sorun

2 Cevap php

Ben şu sorunla karşı karşıya

function book($memberid, $classid){
if (!book){
 // update the db and change the book variable to true
}
}

My problem is 2 requests submitted at the same time. The first request passes the line if (!book){ but not yet update the db. And at the same time, the second request runs the same function and also passes the line if (!book){. Therefore, the result is wrong.

I want to know how to solve this concurrency problem. Lock the db? But I am afraid that it will affect the performance.

2 Cevap

Neden bu değişken gerekiyor?

Veritabanlarını güncellemek zaman eşzamanlılık sorunlarının çözümünde standart yol veritabanı işlemleri ile halledeyim için (bazı durumlarda performansı etkiler, ancak bunu tek çözüm bir kod olacak).

Ben if (! Kitap) yan tümcesi içinde neler olup bittiğini görmek istiyorum.

EDIT: Neden (kişi, sınıf) birleşimi, benzersiz bir anahtar yapmak için db değiştirmek değil mi? Bu şekilde sadece fiziksel tabloda iki kez aynı değeri ekleyebilirsiniz olamaz. Bu veritabanının yapısına bağlıdır çünkü ben hala tahminde alıyorum. Ayrıca MySQL burada uygun olacak bir koşullu ekleme yapmak için özel bir sözdizimi vardır. Bu kontrol url.

Eğer kullanabilir miyim

UPDATE x SET y WHERE z

sonra sadece check affected rows şey değişmiş olup olmadığını görmek için? Bu şekilde, MYSQL etkin denetimi ve hiçbir eşzamanlılık sorunları ile sizin için bir tane düzgün atomik işlemde gerçek veri değişimi hem yok. (, Bir ekleme ise bu yaklaşım işe yaramaz ama VolkerK adlı olur sana kelime "güncelleme" kullanmak ve Q "eklemek" değil aslında bu dayandırarak kulüpler)

Eğer gerçekten SELECT tarafından kontrol gerekiyorsa, daha sonra 2 ayrı tablo şeklinde UPDATE yazmak, işlemlerinin ardından gitmek için tek yoldur. Sen DB kilitleme doğurabilirdi - sizin için mevcut tek seçenek olmadığını unutmayın. Eğer InnoDB tabloları kullanıyorsanız kullanabileceğiniz birçok farklı düzeyleri vardır.