Domanda

Ho letto che alcuni sviluppatori / dbas raccomandano di utilizzare le transazioni in tutte le chiamate al database, anche in sola lettura. Mentre intendo inserire / aggiornare all'interno di una transazione, quali sono i vantaggi della lettura all'interno di una transazione?

È stato utile?

Soluzione

In questo modo si ottiene una visione coerente del database. Immagina di avere due tabelle collegate tra loro, ma per qualche motivo fai 2 selezioni ... in pseuodocodice:

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

Se tra le due query qualcuno cambia B per eliminare alcune righe, si verificherà un problema.

Altri suggerimenti

Simile a quello che ha detto RoBorg, faresti SELECTS con transazioni per impedire la lettura di dati fantasma tra le dichiarazioni. MA è importante notare che il livello di isolamento delle transazioni predefinito in SQL Server è LEGGI IMPEGNATO che impedisce solo letture sporche; per evitare dati fantasma dovresti usare almeno REPEATABLE READ. " Usa questa opzione solo quando necessario. "

http://msdn.microsoft.com/en-us/library /ms173763.aspx

Ho scoperto che le "transazioni" si comportano in modo molto diverso su diversi server SQL. In alcuni casi, l'avvio di una transazione impedisce a tutte le altre connessioni di eseguire qualsiasi SQL fino a quando la transazione non viene impegnata o ripristinata (MS SQLServer 6.5). Altri non hanno alcun problema e si bloccano solo in caso di modifica (oracolo). I blocchi possono anche espandersi per comprendere solo le modifiche: blocchi di celle / blocchi di riga / blocchi di pagine / blocchi di tabelle.

In genere utilizzo le transazioni solo quando è necessario mantenere l'integrità dei dati tra più istruzioni di inserimento / eliminazione / aggiornamento. Tuttavia, preferisco implementarlo usando le eliminazioni a cascata definite da DB in modo che il database lo faccia automaticamente e atomicamente.

Utilizzare una transazione se è possibile prevedere una situazione in cui si desidera eseguire il rollback di più modifiche, ma in caso contrario il database eseguirà gli aggiornamenti atomici senza il codice aggiuntivo per gestirla.

L'ho verificato negli ultimi minuti, poiché è qualcosa che dovrei sapere di più. Ecco cosa ho trovato.

Le transazioni sarebbero utili intorno a una selezione se vuoi bloccare quella riga mentre una persona sta leggendo i record e non vuoi che sia modificata o letta. Ad esempio, esegui queste query:

(nella finestra della query 1)

INIZIA TRAN SELEZIONA * DA MYTABLE CON (ROWLOCK XLOCK) WHERE ID = 1

(nella finestra della query 2)

SELEZIONA * DA MYTABLE WHERE ID = 1

(la finestra di query 2 non restituirà risultati finché non si esegue questo nella finestra 1)

COMMIT TRAN

Link utili:

http://msdn.microsoft.com/en-us/library /aa213039.aspx

http://msdn.microsoft.com/en-us/library /aa213026.aspx

http://msdn.microsoft.com/en-us/library /ms190345.aspx

Il mio obiettivo era quello di ottenere qualcosa da bloccare - e alla fine ha funzionato dopo aver aggiunto XLOCK. Il semplice utilizzo di ROWLOCK non funzionava. Suppongo che stesse emettendo un blocco condiviso (e che i dati fossero stati letti) .. ma sto ancora esplorando questo.

L'aggiunta - CON (UPDLOCK ROWLOCK) - ti permetterà di selezionare e bloccare le righe sugli aggiornamenti, il che aiuterebbe con la concorrenza.

Fai attenzione ai suggerimenti per la tabella. Se inizi ad applicarli a casaccio, il tuo sistema rallenterà a gattonare se ottieni anche un piccolo numero di utenti sulla tua app. Questa è l'unica cosa che sapevo prima di esaminare questo;)

Direi che uno degli scopi principali di una transazione è offrire il potenziale di rollback in caso di problemi, che è defunto quando si legge semplicemente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top