Sen sorguya ekstra bir koşul ekleyerek ve kullanarak atomik yapabilirsiniz mysql_affected_rows()
a>:
$scCost = $row["gpsc"];
$user_id = mysql_real_escape_string($user_id);
$sql = <<<END
UPDATE member_profile
SET points = points - $scCost
WHERE user_id = $user_id
AND points >= $scCost
END;
mysql_query($sql);
if (mysql_affected_rows() > 0) {
// they can afford it
}
Bunu yaparken önemli ölçüde daha iyi bir SELECT
bir yarış durumu tanıttı hangi bir UPDATE
izledi.
Caveat: mysql_affected_rows()
olan satır sayısını döndürür changed. Bu anlamak önemlidir. Eğer bu sorgunun içine 0 maliyetini geçerseniz ile sonuna kadar:
UPDATE member_profiles SET points = points - 0 ...
Hiçbir satır nerede değişti çünkü mysql_affected_rows()
always bu örneği 0 dönecektir. 0 maliyet geçerli bir durum olmadığını Yani, bu filtre ve tüm sorguyu çalıştıran rahatsız gerekir.
Bir satır güncelliyoruz ama bir seferde birkaç satır değiştirmek istiyorsanız bu biraz daha zor alırsa da bu iyi çalışır. Sonra gibi sorulara içine almak:
- Ne olursa bazı "satır" Bunu göze ama diğerleri değil mi?
- Eğer hepsini başarısız istiyor musunuz?
- Nasıl olanlar bunu göze alamazdı hangi bildirebilirim?
- Tüm bu nasıl atomik yaparsınız?
Bu normalde önerilen yaklaşım değildir ve kesinlikle bir kerede güncellemeleri binlerce ölçekli olmayacak olsa bile, bir defada bir UPDATE
yapıyor kapalı iyi olabilir.