Seperti yang diharapkan
-
SELECT dengan ORDER BY, tanpa ROWLOCK, tanpa indeks akan memiliki kunci tabel karena pemindaian/pengurutan menengah untuk menyelesaikan TOP 2. Jadi sesi ke-2 melewatkan seluruh tabel karena READPAST
-
SELECT tanpa ORDER BY hanya memilih 2 baris, yang kebetulan dalam urutan penyisipan (kebetulan murni, tidak ada urutan tersirat). Fakta bahwa 2 baris ini terkunci menyebabkan sesi ke-2 melompat ke baris tidak terkunci berikutnya.
SQL Server mencoba untuk menjaga kunci sedetail mungkin tetapi pemindaian berarti kunci tabel. Sekarang, ini biasanya tidak akan membuat perbedaan (ini akan menjadi kunci baca bersama) tetapi Anda juga memiliki UPDLOCK yang berarti tabel yang dikunci secara eksklusif
Jadi, Anda membutuhkan keduanya
- 3 petunjuk dalam kueri SELECT (ROWLOCK, UPDLOCK, READPAST) untuk mengontrol perincian, isolasi, dan konkurensi.
Menggunakan ROWLOCK saja masih akan menyebabkan kunci eksklusif pada setiap baris untuk memindai/mengurutkan. - indeks pada
Value
TERMASUKTestID
untuk membuat SELECT efisien. Indeks saja mungkin akan memperbaiki konkurensi tetapi tidak dijamin.
Dalam salah satu pertanyaan Anda sebelumnya, saya menautkan ke jawaban saya (dalam komentar) ke Kondisi Balap Antrian Proses SQL Server di mana saya memiliki semua 3 petunjuk kunci