Saya menggunakan SQL Server 2005 Express.
Dalam skenario, saya menambahkan Begin Transaction
perintah tepat sebelum INSERT
pernyataan dalam prosedur tersimpan. Ketika saya menjalankan prosedur tersimpan ini, itu mengunci seluruh tabel dan semua koneksi bersamaan menunjukkan tampilan digantung sampai saat ini INSERT
selesai.
Mengapa seluruh tabel terkunci dan bagaimana cara mengatasi masalah ini di SQL Server 2005 Express?
Diedit
Kueri adalah sebagai berikut:
INSERT INTO <table2> SELECT * FROM <table1> WHERE table1.workCompleted = 'NO'
Jawaban:
Jawaban ini mungkin terbukti membantu untuk pertanyaan awal tetapi terutama untuk mengatasi informasi yang tidak akurat di pos lain. Ini juga menyoroti bagian omong kosong di BOL.
Bagian tertaut dari status BOL:
NB: Pada 2014-8-27 BOL telah diperbarui untuk menghapus pernyataan yang salah yang dikutip di atas.
Untungnya ini bukan masalahnya. Jika sudah begitu sisipan ke tabel akan terjadi secara serial dan semua pembaca akan diblokir dari seluruh tabel sampai transaksi penyisipan selesai. Itu akan membuat SQL Server sebagai server database seefisien NTFS. Tidak terlalu.
Akal sehat menunjukkan hal itu tidak mungkin terjadi, tetapi seperti yang ditunjukkan oleh Paul Randall, " Tolong, jangan percayai siapa pun ". Jika Anda tidak dapat mempercayai siapa pun, termasuk BOL , saya kira kita hanya harus membuktikannya.
Buat database dan isi tabel dummy dengan banyak baris, mencatat DatabaseId dikembalikan.
Menyiapkan pelacakan profiler yang akan melacak kunci: diperoleh dan mengunci: peristiwa yang dirilis, memfilter pada DatabaseId dari skrip sebelumnya, mengatur path untuk file dan mencatat TraceId yang dikembalikan.
Masukkan baris dan hentikan jejak:
Buka file jejak dan Anda harus menemukan yang berikut:
Urutan kunci yang diambil adalah:
Kunci kemudian dilepaskan dalam urutan terbalik. Pada titik tidak ada kunci eksklusif diperoleh di atas meja.
Ya itu. SQL Server (dan bisa dibilang mesin basis data relasional) tidak memiliki pandangan ke depan untuk apa batch lain dapat berjalan ketika memproses pernyataan dan / atau batch, sehingga urutan akuisisi kunci tidak bervariasi.
Untuk contoh khusus ini, kunci yang sama diambil. Jangan percaya padaku, coba!
sumber
Saya tidak melakukan banyak pekerjaan T-SQL tetapi dari membaca dokumentasi ...
Ini dengan desain, sebagaimana dinyatakan dalam TRANSAKSI BEGIN :
Dan seperti yang dinyatakan untuk dokumentasi INSERT , itu akan mendapatkan kunci eksklusif di atas meja. Satu-satunya cara SELECT dapat dilakukan terhadap tabel adalah dengan menggunakan
NOLOCK
atau mengatur tingkat isolasi transaksi.sumber