Mengatasi Keadaan Perlumbaan Pelayan SQL dalam Pemprosesan Pesanan
Artikel ini menangani masalah biasa: beberapa pemproses pesanan menghadapi keadaan perlumbaan apabila mengakses baris gilir pesanan melalui prosedur tersimpan. Prosedur yang disimpan menggunakan ID unik untuk mengunci 20 pesanan seterusnya untuk diproses. Walau bagaimanapun, akses serentak boleh menyebabkan berbilang pemproses menuntut pesanan yang sama, mengakibatkan ralat pemprosesan.
Punca utama ialah keterlihatan transaksi yang tidak komited. Walaupun dengan ROWLOCK
, yang biasanya menghalang akses baris serentak, perubahan tanpa komitmen tidak dapat dilihat oleh pemproses lain yang memeriksa kunci. Ini mewujudkan keadaan perlumbaan.
Penyelesaian melibatkan penggunaan READPAST
dan UPDLOCK
pembayang dalam pernyataan SELECT
dan UPDATE
anda. READPAST
memberitahu pangkalan data untuk memintas baris terkunci, mengelakkan gangguan daripada kemas kini tanpa komitmen. UPDLOCK
memastikan kunci eksklusif pada baris yang dikemas kini sehingga transaksi dilakukan, menghalang pemproses lain daripada mengubah suainya.
Berikut ialah kod yang dipertingkatkan yang menggabungkan petua ini:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo SET ProcessorID = @PROCID FROM OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
Untuk kecekapan dipertingkatkan, pertimbangkan untuk menggunakan klausa OUTPUT
. Ini menggabungkan operasi SELECT
dan UPDATE
, mengemas kini jadual dan mengembalikan baris yang diubah suai dalam satu langkah. Ini menghapuskan keperluan untuk pernyataan SELECT
yang berasingan.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Barisan Pemprosesan Pesanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!