UPDATE
mengunci baris, jadi Anda tidak perlu menguncinya terlebih dahulu. Jika Anda mencoba UPDATE
tumpang tindih set baris secara bersamaan, UPDATE
kedua akan menunggu transaksi pertama untuk melakukan atau memutar kembali.
Masalah besar dengan pendekatan Anda - selain fakta bahwa UPDATE
tidak memiliki LIMIT
klausa - adalah bahwa banyak pekerja semuanya akan mencoba mengambil baris yang sama. Inilah yang terjadi:
- worker1:Memfilter tabel untuk menemukan 200 baris dan menguncinya
- worker1:mulai memperbarui baris
- worker2:memfilter tabel untuk menemukan 200 baris
- worker2:mencoba untuk mulai memperbarui baris, tetapi telah memilih baris yang sama dengan worker1 sehingga memblokir kunci worker1
- worker1:Selesai memperbarui baris
- worker2:Setelah kunci dilepas, periksa kembali kondisi WHERE dan temukan bahwa tidak ada baris yang cocok lagi karena worker1 telah memperbaruinya. Memperbarui nol baris.
... dan ulangi!
Anda harus:
- Memiliki antrian pusat membagi-bagikan baris dengan cara aman-konkurensi yang tepat; atau
- Tetapkan rentang ID yang tidak tumpang tindih untuk dikerjakan oleh pekerja
Adapun LIMIT
- Anda bisa menggunakan WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)
- tetapi Anda akan memiliki masalah yang sama dengan kedua pekerja memilih kumpulan baris yang sama untuk diperbarui.