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ść.