Jika klien membutuhkan waktu lama untuk menerima data dan pada gilirannya mengirim pengakuan ke SQL Server bahwa ia telah menerima data SQL Server harus menunggu, karena menunggu ini SQL Server tidak akan merilis kunci yang dipegang oleh permintaan kecuali pengakuan diterima dari klien.
Ini tidak akurat, itu tergantung pada tingkat isolasi.
Pada awalnya READ COMMITTED
kunci tidak ditahan selama durasi eksekusi pernyataan.READ COMMITTED
tidak memberikan konsistensi tingkat pembacaan pernyataan, satu-satunya jaminan adalah bahwa Anda tidak dapat membaca data yang tidak dikomit. Kunci bersama diperoleh dan ditahan untuk membaca baris dan kemudian dilepaskan.
Kecuali Anda memiliki tipe LOB.
Jenis LOB, karena berpotensi sangat besar, tidak dapat disangga. Kunci yang dibagikan harus diperoleh dan ditahan sampai pernyataan selesai, pada dasarnya memberi Anda REPEATABLE READ
perilaku di READ COMMITTED
.
Jika saya melakukan satu panggilan ke database MSSQL melalui jaringan latensi tinggi, akankah kunci tabel terjadi karena latensi itu?
Latensi tidak menyebabkan kunci tabel, tidak. Namun, jika kunci meja telah diperoleh, latensi akan memperpanjangnya.
Mengutip seseorang yang tahu mekanisme ini lebih baik dari saya ( @RemusRusanu ):
Hasilnya dikembalikan kembali ke program klien saat eksekusi berlangsung. Sebagai baris 'gelembung' di pohon eksekusi, operator teratas biasanya ditugaskan menulis baris ini ke buffer jaringan dan mengirimkannya untuk kembali ke klien. Hasilnya tidak dibuat terlebih dahulu ke beberapa penyimpanan perantara (memori atau disk) dan kemudian dikirim kembali ke klien, melainkan dikirim kembali seperti yang sedang dibuat (saat query dijalankan). Mengirim hasil kembali ke klien, tentu saja, tunduk pada protokol kontrol aliran jaringan. Jika klien tidak secara aktif mengonsumsi hasilnya (mis. Dengan memanggil SqlDataReader.Read ()) maka pada akhirnya kontrol aliran harus memblokir sisi pengiriman (kueri yang sedang dieksekusi) dan ini pada gilirannya akan menunda eksekusi pertanyaan.[sumber]
Di mana hasil tidak dikonsumsi secepat SQL Server dapat mengirimkannya, baik itu karena klien atau jaringan, kami melihat ASYNC_NETWORK_IO
menunggu akumulasi. Untuk mengulangi, ini tidak akan mempengaruhi kunci yang diperoleh, hanya durasi mereka ditahan.
nolock
petunjuk, akan selalu ada kunci . Latensi hanya menentukan berapa lama kunci akan ditahan.