Engellenen bir oturumun ayrıntılarını nasıl izleyeceğimizi anlamaya / öğrenmeye çalışıyorum.
Bu yüzden aşağıdaki kurulumu oluşturdum:
create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;
Şimdi veritabanına iki farklı istemciden iki kez bağlanıyorum.
İlk oturum:
begin transaction
update foo set some_data = 'update'
where id = 1;
Ben açıkça do not kilitleri tutmak için orada işlemek.
İkinci seansta aynı ifadeyi veriyorum ve elbette ki kilitlenmeyi beklemektedir. Şimdi oturum 2 foo
tabloyu bekliyor görmek için etrafında yüzen farklı sorguları kullanmaya çalışıyorum .
sp_who2
aşağıdakileri gösterir (yalnızca önemli bilgileri göstermek için bazı sütunları kaldırdım):
SPID | Durum | BlkBy | DBName | Komut | SPID | RequestID ----- + -------------- + ------- + ---------- + ---------- -------- + ------ + ---------- 52 | uyku | . | foodb | BEKLENEN KOMUT | 52 | 0 53 | uyku | . | foodb | BEKLENEN KOMUT | 53 | 0 54 | ASMA | 52 | foodb | GÜNCELLEME | 54 | 0 56 | ÇALIŞABİLİR | . | foodb | SEÇİNİZ | 56 | 0
Bu beklenir, oturum 54, oturum 52'deki taahhüt edilmemiş değişiklikler nedeniyle engellenir.
Sorgulama bunu sys.dm_os_waiting_tasks
da gösterir. İfade:
select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;
İadeler:
oturum_kimliği | wait_type | kaynak_adresi | resource_description ----------- + ----------- + -------------------- + ----- -------------------------------------------------- -------------------------- 54 | LCK_M_X | 0x000000002a35cd40 | keylock hobtid = 72057594046054400 dbid = 6 id = lock4ed1dd780 modu = X ilişkiliObjectId = 72057594046054400
Yine bu bekleniyor.
Benim sorunum, oturum 54 beklediği gerçek nesne adını bulmak nasıl anlayamıyorum olmasıdır.
Ben katılmadan sys.dm_tran_locks
ve bunun sys.dm_os_waiting_tasks
gibi birkaç sorgu bulduk :
SELECT ....
FROM sys.dm_tran_locks AS l
JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address
Ancak yukarıdaki test senaryomda bu birleştirme bir şey döndürmüyor. Yani ya birleştirme yanlış ya dm_tran_locks
da aslında aradığım bilgiyi içermiyor.
Ben ne aradığım gibi bir şey döndüren bir sorgu:
" oturum 54 tabloda bir kilit bekliyorfoo
".
Bazı arka plan bilgileri:
Çözmeye çalıştığım gerçek sorun biraz daha karmaşık, ama "hangi tabloda oturum 54 bekliyor" sorusuna kayıyor. Söz konusu sorun, birkaç tabloyu güncelleyen büyük bir saklı yordam ve bu tabloların bazılarına erişen bir görünümden seçim içerir. select
Deyim biz anlık yalıtım ve taahhüt anlık etkin okumamıza rağmen engellenir. Seçimin neden engellendiğini (anlık görüntü yalıtımı etkinleştirilirse mümkün olmadığını düşündüm) bulmak bir sonraki adım olacaktır.
İlk adım olarak, o oturumun ne beklediğini öğrenmek istiyorum .