Prawidłowy sposób na wyłączny zamek

Piszę procedurę, która będzie godzić transakcje finalne w żywej bazie danych. Praca, którą wykonuję, nie może być wykonana jako operacja ustawiania, więc używam dwóch zagnieżdżonych kursorów.

Muszę wziąć wyłączną blokadę w tabeli transakcji, gdy uzgadniam dane dla każdego klienta, ale chciałbym zwolnić blokadę i pozwolić innym osobom uruchamiać swoje zapytania między każdym klientem, którego przetwarzam.

Chciałbym zrobić ekskluzywny zamek na poziomie wiersza zamiast poziomu tabeli, aleco przeczytałem do tej pory mówi, że nie mogę tego zrobićwith (XLOCK, ROWLOCK, HOLDLOCK) jeśli inne transakcje są uruchomioneREADCOMMITED poziom izolacji (który jest dla mnie).

Czy prawidłowo blokuję tabelę na poziomie tabeli i czy w Server 2008 R2 można w jakiś sposób blokować wyłączność na poziomie wiersza tak, jak chcę, bez modyfikowania innych zapytań uruchomionych w bazie danych?

declare client_cursor cursor local forward_only for 
     select distinct CLIENT_GUID from trnHistory
open client_cursor

declare @ClientGuid uniqueidentifier
declare @TransGuid uniqueidentifier

fetch next from client_cursor into @ClientGuid
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    IF (@@FETCH_STATUS <> -2)
    BEGIN
        begin tran

        declare @temp int

        --The following row will not work if the other connections are running READCOMMITED isolation level
        --select @temp = 1 
    --from trnHistory with (XLOCK, ROWLOCK, HOLDLOCK) 
    --left join trnCB with (XLOCK, ROWLOCK, HOLDLOCK) on trnHistory.TRANS_GUID = trnCB.TRANS_GUID
    --left join trnClients with (XLOCK, ROWLOCK, HOLDLOCK) on trnHistory.TRANS_GUID = trnClients.TRANS_GUID
    --(Snip) --Other tables that will be "touched" during the reconcile
    --where trnHistory.CLIENT_GUID = @ClientGuid

        --Works allways but locks whole table.
    select top 1 @temp = 1 from trnHistory with (XLOCK, TABLOCK) 
    select top 1 @temp = 1 from trnCB with (XLOCK, TABLOCK)
    select top 1 @temp = 1 from trnClients with (XLOCK, TABLOCK)
    --(Snip) --Other tables that will be "touched" during the reconcile

        declare trans_cursor cursor local forward_only for 
                select TRANS_GUID from trnHistory where CLIENT_GUID = @ClientGuid order by TRANS_NUMBER
        open trans_cursor

        fetch next from trans_cursor into @TransGuid
        WHILE (@@FETCH_STATUS <> -1)
        BEGIN
            IF (@@FETCH_STATUS <> -2)
            BEGIN

                --Do Work here

            END
            fetch next from trans_cursor into @TransGuid
        END

        close trans_cursor
        deallocate trans_cursor

            --commit the transaction and release the lock, this allows other 
            -- connections to get a few queries in while it is safe to read.
        commit tran
    END

    fetch next from client_cursor into @ClientGuid
END 

close client_cursor
deallocate client_cursor

questionAnswers(2)

yourAnswerToTheQuestion