2011-09-14 5 views
5

quiero hacer lo siguiente en una transacción:cuestión de transacciones de SQL para principiantes: la prevención de la carrera de lectura - calcular -Escribir

  • leer una columna
  • si el valor de la columna coincide con una determinada condición, escriba una nuevo valor en la columna

aislamiento de transacción se establece en read-commited, el servidor es SQL server.

¿Cómo puedo garantizar que otra transacción no escriba un valor diferente a la columna después de leerlo? ¿El servidor rechazará mi escritura si otra transacción cambió la columna?

En otras palabras, ¿se puede usar el servidor SQL como un bloqueo distribuido en una columna determinada?

Respuesta

1

En este caso necesita usar el nivel de aislamiento REPEATABLE READ. Con READ COMMITTED otra transacción puede cambiar su registro.
Si puede reescribir su lógica en 1 consulta (por ejemplo, con update o merge), aún puede usar READ COMMITTED. Pero a veces no es la opción. Por ejemplo,

SELECT ... ; 
IF some_condition 
BEGIN 
    // execute a procedure, select from other tables, etc 
END 
ELSE 
BEGIN 
    // execute another procedure, do some other stuff 
END; 
// finally update the record 
UPDATE .... 

actualización

Hay otra opción me olvidó mencionar: cuadro de utilización indirecta REPEATABLEREAD en su estado de cuenta SELECT (See para más detalles)

4

¿Quién dijo que debes leerlo primero?

UPDATE yourtable 
SET yourcolumn = CASE 
         WHEN certaincondition = 1 THEN 'newvalue' 
         ELSE yourcolumn 
        END 
WHERE id = 'yourid' 

Evalúa dentro del UPDATE sí mismo. Está garantizado que está totalmente aislado. Puede tener múltiples de este mismo UPDATE ejecutándose desde instancias diferentes, las transacciones se pondrán en cola y se procesarán una por una.

Cuestiones relacionadas