Mengelakkan Keadaan Perlumbaan dalam Baris Gilir Pesanan Pelayan SQL
Pemproses berbilang pesanan mengakses baris gilir pesanan melalui prosedur tersimpan, mendapatkan 20 pesanan setiap satu. Ini boleh menyebabkan keadaan perlumbaan di mana berbilang pemproses mengambil pesanan yang sama, mengakibatkan ralat pemprosesan.
Berikut ialah penyelesaian untuk menghapuskan isu konkurensi ini:
Satu pendekatan menggunakan petunjuk READPAST
untuk memintas baris terkunci, ditambah dengan ROWLOCK
untuk mengelakkan peningkatan kunci dan UPDLOCK
untuk penguncian baris eksklusif. Ini membolehkan setiap pemproses mengunci kumpulan baris yang berbeza (cth., pemproses 1 mengunci baris 1-20, pemproses 2 mengunci baris 21-40 dan seterusnya).
Prosedur tersimpan yang diubah suai akan kelihatan seperti ini:
<code class="language-sql">UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0;</code>
Kaedah lain melibatkan penggunaan klausa OUTPUT
. Ini menggabungkan operasi SELECT
dan UPDATE
ke dalam satu pernyataan atom, menjamin ketersediaan segera baris yang dikemas kini kepada pemproses. Ini menghapuskan keperluan untuk operasi SELECT
dan UPDATE
berasingan, sekali gus menghalang keadaan perlumbaan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Keadaan Perlumbaan Semasa Memproses Pesanan daripada Baris Gilir Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!