Jak sprawdzić locki?

0

Cześć, mam dziwny problem.
Są dwie tabele: tab_a i tab_b. Struktura nieistotna, ale jest prawie identyczna.

W tab_a mam pewne rekordy. Następne w transakcji robię update pewnych kolumn. Na koniec kopiuję rekordy do tab_b i czyszczę tab_a Jest to robione następująco:

begin try
  begin transaction
    update tab_a SET .... -- jest kilka takich updateów

    insert into tab_b(lista_kolumn)
    SELECT lista_kolumn
    FROM tab_a

    truncate table tab_a
  commit transaction
end try
begin catch
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

  -- jeśli wystąpił błąd, to poinformuj
  print 'Error in MyProc at line '+cast(Error_Line() as varchar(10))+
		': '+cast(ERROR_NUMBER() as varchar(10))+
		': '+ERROR_MESSAGE()	
end catch

PO WYKONANIU tej transakcji, w drugiej aplikacji robię update w tabeli tab_b. I ten update się wykonuje w nieskończoność, po prostu jakby tabela była zablokowana. Nie wywala się też deadlock.
Zanim wykonam ten update, sprawdzam sobie jeszcze na serwerze locki(przynajmniej tak mi się wydaje) poleceniem:

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

Nie zwraca mi to żadnego rekordu. Próbowałem też zapytaniem:

SELECT
t1.resource_type,
t1.resource_database_id,
t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id,
o1.name 'object name',
o1.type_desc 'object descr',
p1.partition_id 'partition id',
p1.rows 'partition/page rows',
a1.type_desc 'index descr',
a1.container_id 'index/page container_id'
FROM sys.dm_tran_locks as t1
INNER JOIN sys.dm_os_waiting_tasks as t2
	ON t1.lock_owner_address = t2.resource_address
LEFT OUTER JOIN sys.objects o1 on o1.object_id = t1.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions p1 on p1.hobt_id = t1.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units a1 on a1.allocation_unit_id = t1.resource_associated_entity_id 

jednak ono wykonuje się też w nieskończoność. Znalezione tu: http://stackoverflow.com/questions/694581/how-to-check-which-locks-are-held-on-a-table

Więc moje pytania:

  • czym opisane zachowanie może być spowodowane (zaznaczam, że wszystkie transakcje są commitowane)
  • jak dokładnie sprawdzić jakie locki, gdzie i przez co są założone.

Co więcej, jeśli po wykonaniu ww transakcji zrobię:

select * from tab_b with (nolock) 

, to pokazują mi się rekordy.
Ale jeśli zrobię to samo z tab_a, to też czekam w nieskończoność.

0

masz na pewno nieskomitowana transakcje

zrob cos takiego

sp_who2 i zobaczy czy masz jakies blockedby.
jak znajdziesz blocekd by to wyswietl proces + ten blokujacy (spid, blockedbyid)

dbb inputbuffer(...... tutaj id z sp_who2)

btw with (nolock) jest odpowiednikiem
set transaction isolation level read uncommitted.

0

btw nie sprawdzaj @@trancount tylko

xact_state() = -1 rollback
xact_state() = 1 commit
xact_state() = 0 > notjing to do

1 użytkowników online, w tym zalogowanych: 0, gości: 1