it-swarm.asia

Cara memeriksa kunci mana yang dipegang di atas meja

Bagaimana kita bisa memeriksa kunci basis data yang diterapkan pada baris mana terhadap kumpulan kueri?

Adakah alat yang menyoroti penguncian level baris tabel secara real time?

DB: SQL Server 2005

139
usman shaheen

Untuk menambah tanggapan lain, sp_lock juga dapat digunakan untuk membuang informasi kunci penuh pada semua proses yang berjalan. Outputnya bisa sangat besar, tetapi jika Anda ingin tahu persis apa yang dikunci, itu sangat berharga untuk dijalankan. Saya biasanya menggunakannya bersama dengan sp_who2 dengan cepat membidik masalah penguncian.

Ada beberapa versi berbeda dari prosedur "pertemanan" sp_lock yang tersedia secara online, tergantung pada versi SQL Server yang dimaksud.

Dalam kasus Anda, untuk SQL Server 2005, sp_lock masih tersedia, tetapi sudah usang, jadi sekarang disarankan untuk menggunakan tampilan sys.dm_tran_locks untuk hal semacam ini. Anda dapat menemukan contoh cara "menggulirkan Anda sendiri" fungsi sp_lock di sini .

110
mwigdahl

Ini tidak persis menunjukkan kepada Anda baris mana yang dikunci, tetapi ini mungkin membantu Anda.

Anda dapat memeriksa pernyataan mana yang diblokir dengan menjalankan ini:

select cmd,* from sys.sysprocesses
where blocked > 0

Ini juga akan memberi tahu Anda apa yang menunggu setiap blok. Jadi, Anda bisa melacaknya sampai tuntas untuk melihat pernyataan mana yang menyebabkan blok pertama yang menyebabkan blok lainnya.

Edit untuk menambahkan komentar dari @ MikeBlandford :

Kolom yang diblokir menunjukkan spid dari proses pemblokiran. Anda dapat menjalankan kill {spid} untuk memperbaikinya.

102
Brian R. Bondy

Anda dapat menemukan kunci saat ini di meja Anda dengan mengikuti kueri.

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

Lihat sys.dm_tran_locks

Jika beberapa contoh sama request_owner_type ada, kolom request_owner_id digunakan untuk membedakan setiap contoh. Untuk transaksi terdistribusi, kolom request_owner_type dan request_owner_guid akan menunjukkan perbedaan informasi entitas.

Misalnya, Sesi S1 memiliki kunci bersama di Table1; dan transaksi T1, yang berjalan di bawah sesi S1, juga memiliki kunci bersama pada Table1. Dalam hal ini, kolom resource_description yang dikembalikan oleh sys.dm_tran_locks akan menampilkan dua contoh dari sumber yang sama. Kolom request_owner_type akan menampilkan satu instance sebagai sesi dan yang lainnya sebagai transaksi. Juga, kolom resource_owner_id akan memiliki nilai yang berbeda.

40
Somnath Muluk

Saya menggunakan Dynamic Management View (DMV) untuk menangkap kunci serta object_id atau partisi_id dari item yang dikunci.

(HARUS beralih ke Database yang ingin Anda amati untuk mendapatkan object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;
35
Jon

Anda juga dapat menggunakan prosedur tersimpan sp_who2 bawaan untuk mendapatkan proses yang diblokir dan memblokir saat ini pada contoh SQL Server. Biasanya Anda akan menjalankan ini bersama contoh SQL Profiler untuk menemukan proses pemblokiran dan melihat perintah terbaru yang spid dikeluarkan dalam profiler.

17
Neil Barnwell