Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Barisan Pemprosesan Pesanan?

Bagaimana untuk Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Barisan Pemprosesan Pesanan?

Susan Sarandon
Lepaskan: 2025-01-18 01:26:12
asal
709 orang telah melayarinya

How to Resolve a SQL Server Race Condition in an Order Processing Queue?

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan