Birincisi: MySQL, özellikle çok dinamikse, bunu uygulamak için olabilecek en kötü yazılım parçalarından biridir. Bunun nedeni, MEMORY ve MyISAM gibi motorların yalnızca tam tablo kilitleri olmasına rağmen, InnoDB gibi daha uygun motorların daha yüksek yazma cezasına sahip olması (ACID özelliklerini sağlamak için) ve uzamsal ve geçici olarak yakın olan (belleğe ayarlanmış kayıtlara erişmek için optimize edilmiş) ). Ayrıca MySQL için iyi bir değişiklik bildirim sistemi yoktur - bir yoklama olarak uygulanmalıdır. Orada daha o görev için optimize edilmiş yazılım kısımlarını onlarca .
Bunu söyledikten sonra, performans / verimlilik gereksinimleri çok yüksek değilse bu tür erişimi başarıyla uyguladım. Birçok insan, iş mantığının sadece küçük bir kısmı için ayrı bir teknoloji parçası sunmayı ve sürdürmeyi göze alamaz.
SELECT FOR UPDATE
aradığınız şey serileştirme. Bir UPDATE / DELETE, çalışan bir MYSQL işlemi sırasında her zaman satırı kilitleyecek olsa da, işlem devam ederken büyük bir işlemden kaçınmak isteyebilirsiniz, bu nedenle:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL, satır seçerken biri hariç tüm eşzamanlı seçimleri kilitlemeye özen gösterir. Bu, aynı anda çok sayıda kilitli bağlantıya yol açabileceğinden, ilk işlemi olabildiğince küçük tutun ve bir seferde 1 satırdan fazlasını işlemeye çalışın.