Sistem pemprosesan pesanan anda mengalami keadaan perlumbaan kerana berbilang pemproses mendapatkan semula rekod yang sama. Begini cara untuk membetulkannya:
Memahami Masalah:
Masalahnya berpunca daripada penggunaan prosedur tersimpan bagi petunjuk ROWLOCK
digabungkan dengan pilihan daripada paparan terkunci secara berasingan. Ini membolehkan berbilang pemproses mengunci rekod yang sama, yang membawa kepada kerosakan data.
Penyelesaian Menggunakan Petua:
Untuk menyelesaikan keadaan perlumbaan, gunakan petua READPAST
dan UPDLOCK
:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) OrderTable foo SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, READPAST, UPDLOCK) WHERE ProcessorID = 0 COMMIT TRAN SELECT OrderID, ProcessorID, etc... FROM OrderTable WHERE ProcessorID = @PROCID</code>
READPAST
mengelakkan baris terkunci semasa pemilihan, memastikan pelaksanaan pertanyaan berterusan. UPDLOCK
menjamin penguncian yang betul semasa kemas kini, menghalang pengubahsuaian serentak.
Penyelesaian yang Lebih Cekap:
Pendekatan yang lebih diperkemas menggunakan klausa OUTPUT
untuk menggabungkan operasi SELECT
dan UPDATE
:
<code class="language-sql">BEGIN TRAN UPDATE TOP (20) foo OUTPUT OrderID, ProcessorID, etc... SET ProcessorID = @PROCID FROM foo WITH (ROWLOCK, UPDLOCK, READPAST) WHERE ProcessorID = 0 COMMIT TRAN</code>
Ini menghapuskan keperluan untuk pernyataan SELECT
yang berasingan, meningkatkan kecekapan dan kejelasan kod.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Pemprosesan Pesanan Kerana Pengambilan Rekod Pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!