Domanda

Quali sono le regole di ambito per i livelli di isolamento delle transazioni in SQL Server 2005? So cosa significano i diversi livelli, ma non come applicarli correttamente al di fuori di uno script eseguito manualmente. Non riesco a trovare una guida per l'uso pratico nel codice di qualità della produzione.

Ovviamente, l'ambito inizia quando si utilizza un comando come questo:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Ma dove finisce? Se imposto il livello iso in una procedura memorizzata e poi quel proc chiama un altro, il proc nidificato lo eredita? Ancora meglio, se intensifico il livello di iso all'interno del proc annidato, verrà eseguito nuovamente nel proc chiamante? I comandi di transazione come BEGIN TRAN, ROLLBACK e COMMIT fanno qualche differenza?

Quando un proc memorizzato viene chiamato da un'applicazione o da un processo agente, le modifiche al livello di isolamento persistono in qualche modo? Devo sempre ripristinare il READ COMMITTED predefinito alla fine di ogni proc?

Lo testerei in diverse situazioni, ma non so come impostare il livello di isolamento corrente.

È stato utile?

Soluzione

Esegui quanto segue e verifica tu stesso:

CREATE PROCEDURE dbo.KeepsIsolation
AS
BEGIN
PRINT 'Inside sproc that does not change isolation level';
DBCC USEROPTIONS;
END
GO

CREATE PROCEDURE dbo.ChangesIsolation
AS
BEGIN
PRINT 'Inside sproc that changes isolation level';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DBCC USEROPTIONS;
END
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DBCC USEROPTIONS;
EXEC dbo.KeepsIsolation;
DBCC USEROPTIONS;
EXEC dbo.ChangesIsolation;
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure
    DBCC USEROPTIONS;

Altri suggerimenti

Da MSDN

  

Se si emette SET LEACEL ISOLATION LEVEL in una procedura memorizzata o   trigger, quando l'oggetto ritorna controlla viene ripristinato il livello di isolamento   al livello in vigore quando l'oggetto è stato invocato . Ad esempio, se   si imposta REPEATABLE READ in un batch e il batch chiama quindi un archivio   procedura che imposta il livello di isolamento su SERIALIZZABILE, l'isolamento   l'impostazione del livello ritorna su REPEATABLE READ quando la procedura memorizzata   restituisce il controllo al batch.

DBCC USEROPTIONS visualizzerà l'attuale livello di isolamento, insieme a tutte le altre opzioni SET.

Dai libri online

  

Solo una delle ISOLAMENTO DI TRANSAZIONE   Le opzioni LIVELLO possono essere impostate alla volta,   e rimane impostato per quella connessione   fino a quando non viene esplicitamente modificato. Questo   diventa il comportamento predefinito a meno che un   l'opzione di ottimizzazione è specificata in   il livello della tabella nella clausola FROM di   la dichiarazione.

Il livello di isolamento non ripristina la transazione.

Il livello di isolamento rimane aggiornato anche se si richiamano procedure e funzioni.

Si noti che esiste un problema con l'ambito di TRANSACTION LEVELS e SqlServer 2012 o precedenti quando viene utilizzato il pool di connessioni ADO.NET ad alte prestazioni in cui ciò può effettivamente persistere attraverso la chiusura della connessione:

SQL Server: perdite di livello di isolamento attraverso connessioni in pool

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation -level? forum = sqldatabaseengine

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