2011-09-15 21 views
6

więc mam procedura przechowywana (SQL Server 2008 R2) coś takiegojest serwer sql transakcja atomowa

BEGIN TRAN 
BEGIN TRY 


    //critical section 
    select value   
    update value 
     //end of critical section 


    COMMIT 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK 
END CATCH 

Chcę ma dwóch procedur przechowywanych czytać tę samą wartość. Innymi słowy, odczyt i aktualizacja powinny być atomowe. Ten kod to robi? Jeśli nie, to jak to zrobić?

+0

Czy możesz podać więcej szczegółów na temat konkretnego przypadku? Jest to bardzo ogólne pytanie i mogą już istnieć dobre wzorce dla tego, co próbujesz zrobić. –

+0

cóż, ta sama procedura jest nazywana ~ jednocześnie i każda musi uzyskać unikalny licznik (to znaczy odczytuje licznik i zwiększa go). I licznik musi być stopniowo zwiększany (brak wartości losowych). – ren

+0

Możesz zwiększyć licznik w pojedynczym komunikacie aktualizacyjnym, który nie wymaga osobnego odczytu. 'UPDATE Foo SET counter = counter + @ increment', ale może nie rozumiem, co próbujesz zrobić. –

Odpowiedz

5

Tak, są one atomowe, ale to nie znaczy, że dostaniesz zachowanie, które chcesz tutaj! Właściwość, na którą musisz zwrócić uwagę, to izolacja.

Aby osiągnąć wymagane wykluczenie, należy wykonać operację SELECT dla pojedynczej wartości mutually exclusive. Można to zrobić poprzez zwrócenie zamka Update (upewnij się, że WHERE orzeczenie można znaleźć poprzez indeks, aby uniknąć blokowania niepotrzebnych dodatkowych wierszy)

SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz' 

Uwaga ta blokada odbędzie się aż transakcja zobowiązuje jednak nie wydany pod koniec sekcji krytycznej, ale zawsze tak będzie, jeśli i tak zaktualizowałeś tę wartość.