2011-09-14 12 views
5

voglio fare quanto segue in una transazione:Newbie transazione sql: prevenire la gara di lettura - calcolare -write

  • leggere una colonna
  • se il valore della colonna corrisponde a una certa condizione, scrivere un nuovo valore alla colonna

l'isolamento della transazione è impostato su read-commit, il server è SQL server.

Come posso garantire che un'altra transazione non scriva un valore diverso alla colonna dopo averlo letto? Il server rifiuterà la mia scrittura se un'altra transazione ha cambiato la colonna?

In altre parole, SQL Server può essere utilizzato come blocco distribuito su una determinata colonna?

risposta

1

In questo caso è necessario utilizzare il livello di isolamento REPEATABLE READ. Con READ COMMITTED un'altra transazione può cambiare il tuo record.
Se è possibile riscrivere la logica in 1 query (ad esempio, con update o merge), è comunque possibile utilizzare READ COMMITTED. Ma a volte non è l'opzione. Per esempio,

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

Aggiornamento

C'è un'altra opzione Ho dimenticato di dire: tavola degli impieghi suggerimento REPEATABLEREAD nel SELECT economico (See per i dettagli)

4

Chi ha detto che devi leggerlo prima?

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

Si valuta all'interno dello stesso UPDATE. È garantito che sia totalmente isolato. È possibile avere più di questo stesso UPDATE in esecuzione da istanze diverse, le transazioni verranno accodate ed elaborate una alla volta.

Problemi correlati