Domanda

E 'vero che "Ogni dichiarazione (selezionare / inserimento / cancellazione / aggiornamento) ha un livello di isolamento a prescindere delle transazioni"?

Ho uno scenario in cui ho impostato aggiornamento e istruzioni all'interno di una transazione (READCOMMITTED). E un altro non è impostato in una transazione (selezionare le dichiarazioni).

  1. In questo caso quando prima serie è in esecuzione un altro aspetta.
  2. Se ho impostato READ_COMMITTED_SNAPSHOT per DB deadlock si verifica.

    ALTER DATABASE Amelio SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE Amelio SET READ_COMMITTED_SNAPSHOT ON
    

Per risolvere questo problema, ho bisogno di mettere "Select" dichiarazioni in TransactionScope?

È stato utile?

Soluzione

In SQL Server ogni transazione ha un livello di transazione implicita o esplicita. Esplicita se chiamato con BEGIN/COMMIT/ROLLBACK TRANSACTION, implicita se nulla di tutto questo è stato rilasciato.

Inizia la tua snapshot prima la query di aggiornamento inizia. In caso contrario, si dà alcuna possibilità di preparare le righe modificate in tempdb e la query di aggiornamento ha ancora la serratura aperta di SQL Server.

Un altro modo senza creare un isolamento dello snapshot è quello di utilizzare SELECT <columns> FROM <table> WITH (NOLOCK) che è il modo di raccontare SQL Server per ottenere le righe non importa quale (aka READ_UNCOMMITED). Come è un hint di query cambia il livello di isolamento, anche con le impostazioni. Può funzionare se non vi dà fastidio che lo stato della riga viene interrogato -. Tuttavia cautela deve essere usato quando si valutano i dati ricevuti

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