Shared Lock dikeluarkan pada IsolationLevel.ReadUncommitted

10

Saya membaca bahwa jika saya menggunakan IsolationLevel.ReadUncommitted, kueri tidak boleh mengeluarkan kunci apa pun. Namun, ketika saya menguji ini, saya melihat kunci berikut:

Resource_Type: HOBT
Request_Mode: S (Dibagi-pakai)

Apa itu kunci HOBT? Sesuatu yang terkait dengan HBT (Heap atau Binary Tree lock)?

Mengapa saya masih mendapatkan kunci S?

Bagaimana cara menghindari penguncian bersama saat kueri tanpa mengaktifkan opsi snapshot level isolasi?

Saya menguji ini pada SQLServer 2008, dan opsi snapshot dimatikan. Permintaan hanya melakukan pilih.

Saya dapat melihat bahwa Sch-S diperlukan, meskipun SQL Server tampaknya tidak akan menampilkannya di kueri kunci saya. Kenapa masih mengeluarkan Kunci Bersama? Berdasarkan:

SET TINGKAT ISOLASI TRANSAKSI (Transact-SQL)

Transaksi berjalan di READ UNCOMMITTEDtingkat tidak mengeluarkan kunci bersama untuk mencegah transaksi lain dari memodifikasi data yang dibaca oleh transaksi saat ini.

Jadi saya agak bingung.

dsum
sumber

Jawaban:

13

Apa itu kunci HOBT?

Kunci yang melindungi pohon-B (indeks) atau halaman tumpukan data dalam tabel yang tidak memiliki indeks berkerumun.

Mengapa saya masih mendapatkan kunci S?

Ini terjadi pada tumpukan. Contoh

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

Keluaran READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Keluaran READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Menurut artikel ini referensi Paul Randal alasan untuk mengambil BULK_OPERATIONkunci HOBT bersama ini adalah untuk mencegah pembacaan halaman yang tidak diformat.

Martin Smith
sumber
5

Baca Tingkat isolasi yang tidak terikat memang memperoleh kunci. Skema stabilitas kunci mencegah objek menjadi permintaan dari perubahan saat permintaan dijalankan. Kunci ini diperoleh di bawah semua level isolasi, termasuk snapshot dan read_committed_snapshot (RCSI). Dari Mode Kunci :

Skema Locks

Mesin Database menggunakan kunci modifikasi skema (Sch-M) selama operasi bahasa definisi data tabel (DDL), seperti menambahkan kolom atau menjatuhkan tabel. Selama dipegang, kunci Sch-M mencegah akses bersamaan ke meja. Ini berarti kunci Sch-M memblokir semua operasi di luar hingga kunci dilepaskan.

Beberapa operasi bahasa manipulasi data (DML), seperti pemotongan tabel, menggunakan kunci Sch-M untuk mencegah akses ke tabel yang terpengaruh oleh operasi bersamaan.

Mesin Database menggunakan kunci skema stabilitas (Sch-S) ketika menyusun dan mengeksekusi query. Kunci Sch-S tidak memblokir kunci transaksional, termasuk kunci eksklusif (X). Oleh karena itu, transaksi lain, termasuk yang dengan kunci X di atas meja, terus berjalan saat kueri sedang dikompilasi. Namun, operasi DDL bersamaan, dan operasi DML bersamaan yang memperoleh kunci Sch-M, tidak dapat dilakukan di atas meja.

Remus Rusanu
sumber