Pertama: MySQL adalah salah satu perangkat lunak yang paling buruk untuk mengimplementasikannya, khususnya jika sangat dinamis. Alasannya adalah bahwa mesin seperti MEMORY dan MyISAM hanya memiliki kunci tabel penuh sementara mesin yang lebih cocok seperti InnoDB memiliki penalti tulis yang lebih tinggi (untuk menyediakan properti ACID) dan dioptimalkan untuk mengakses catatan yang secara spasial dan sementara ditutup (yang diatur pada memori ). Juga tidak ada sistem pemberitahuan perubahan yang baik untuk MySQL - itu harus diimplementasikan sebagai polling. Ada lusinan perangkat lunak yang lebih dioptimalkan untuk tugas itu .
Karena itu, saya telah melihat berhasil menerapkan akses semacam ini jika persyaratan kinerja / efisiensi tidak terlalu tinggi. Banyak orang tidak mampu memperkenalkan dan memelihara teknologi yang terpisah hanya untuk sebagian kecil dari logika bisnis.
SELECT FOR UPDATE
adalah apa yang Anda cari- baca serialisasi. Sementara UPDATE / DELETE akan selalu mengunci baris selama menjalankan transaksi MYSQL, Anda mungkin ingin menghindari transaksi besar saat proses sedang berlangsung, jadi:
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 akan menjaga mengunci semua pilihan bersamaan kecuali satu ketika memilih baris. Karena hal ini dapat menyebabkan banyak koneksi yang terkunci pada saat yang bersamaan, pertahankan transaksi awal sekecil mungkin dan cobalah untuk memproses lebih dari 1 baris sekaligus.