Non si blocca DB richiedono le transazioni?
-
18-09-2019 - |
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).
- In questo caso quando prima serie è in esecuzione un altro aspetta.
-
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?
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