Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Pemprosesan Pesanan Kerana Pengambilan Rekod Pendua?

Bagaimanakah Saya Boleh Menyelesaikan Keadaan Perlumbaan Pelayan SQL dalam Pemprosesan Pesanan Kerana Pengambilan Rekod Pendua?

Patricia Arquette
Patricia Arquetteasal
2025-01-18 01:22:10581semak imbas

How Can I Resolve a SQL Server Race Condition in Order Processing Due to Duplicate Record Retrieval?

Mengatasi Syarat Perlumbaan Pelayan SQL dalam Pemprosesan Pesanan

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!

Kenyataan:
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