2011-09-15 10 views
6

por lo que tienen un algo procedimiento almacenado (SQL Server 2008 R2) como estoes de transacción del servidor SQL atómica

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 

quiero no hay dos procedimientos almacenados leen el mismo valor. En otras palabras, leer y actualizar debe ser atómico. Este código hace esto? Si no, ¿cómo lo hago?

+0

¿Puede proporcionar más detalles de su caso específico? Esta es una pregunta muy general y es posible que ya existan buenos patrones para lo que estás tratando de hacer. –

+0

, el mismo procedimiento se llama ~ simultáneamente y cada uno debe obtener un contador único (es decir, lee el contador y lo incrementa). Y el contador debe incrementarse gradualmente (sin valores aleatorios) – ren

+0

Puede incrementar un contador en una sola declaración de actualización, no necesita una lectura por separado. 'ACTUALIZAR Foo SET counter = counter + @ increment' pero quizás no he entendido lo que estás tratando de hacer. –

Respuesta

5

Sí, son atómicos, pero eso no significa que obtendrá el comportamiento que desea aquí. La propiedad que necesita mirar es el aislamiento.

Para lograr la exclusión que necesita, deberá realizar la operación SELECT en el valor único mutually exclusive. Usted puede hacer esto mediante la solicitud de una cerradura Update (asegúrese de que el WHERE predicado se puede encontrar a través de un índice para evitar el bloqueo de filas adicionales innecesarios)

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

Nota este bloqueo se llevará a cabo hasta que la transacción se confirma sin embargo no depurados en el final de la sección crítica, pero ese siempre será el caso si ha actualizado el valor de todos modos.

Cuestiones relacionadas