utilizada dentro de uma transacao longa queexecuta varios processos (INSERTS, UPDATES e DELETES). Estespassos intermediarios que sao executados antes do COMMIT no final, podem serlidos e retornados. Quando isso acontece, chamamos de leitura suja (Dirty Read, do ingles).Veja os codigos abaixo, e execute cadabloco simultaneamente em uma conexao diferente./********* RODAR NA CONEXAO 1 *********/BEGIN TRAN UPDATE tbIsolationLevel set Col1 = 'DDDDD' where id = 1 WAITFOR DELAY '00:00:10'ROLLBACK TRANNo codigo abaixo existem duasconsultas. Ambas podem ler dados sujos, a primeira alterando o isolation levele a segundo consumindo dados com o hint WITH (NOLOCK). No final, o resultado deambas serao os mesmos./********* RODAR NA CONEXAO 2 *********/SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT * FROM tbIsolationLevel-- Usando o hint NOLOCKSELECT * FROM tbIsolationLevel with (nolock)Ja o REPEATABLE READ garanteque a transacao que leia uma tabela mais do que uma vez dentro desta mesma transacao,possa fazer isso sem ler dados diferentes dos registros ja encontrados daprimeira vez. Nenhuma alteracao (UPDATE) dos dados jalidos anteriormente serao modificados na leitura (sao alterados na tabela), masnovos registros (INSERT) sao retornados nestasegunda leitura.Veja nos blocos de codigo abaixo esteprocesso./********* RODAR NA CONEXAO 1 *********/SET TRANSACTION ISOLATION LEVEL REPEATABLE READBEGIN TRAN SELECT * FROM tbIsolationLevel WAITFOR DELAY '00:00:10' SELECT * FROM tbIsolationLevelROLLBACK TRANVeja o SQL Server gerando um WAIT para executar o UPDATE, mas nao o gera quando roda o INSERT, ele simplesmente insere os dados./********* RODAR NA CONEXAO 2 *********/UPDATE tbIsolationLevel set Col1 = 'DDDDD' where id = 1INSERT INTOtbIsolationLevel(Col1,Col2,Col3)VALUES ('DDDDD','EEEEE','FFFFF')Uma variacao mais completa doREPEATABLE READ e o SERIALIZABLE quebloqueia qualquer modificacao de dados nas colunas que sao consultadas,independente da modificacao ser um UPDATE ou um INSERT. Este nivel de isolamento causa um LOCKna transacao original e um WAIT na segunda transacao tanto para o UPDATEquanto para INSERT.Veja este processo nos codigos abaixo:/********* RODAR NA CONEXAO 1 *********/SET TRANSACTION ISOLATION LEVEL SERIALIZABLEBEGIN TRAN SELECT * FROM tbIsolationLevel WAITFOR DELAY '00:00:10' SELECT * FROM tbIsolationLevelROLLBACK TRAN/********* RODAR NA CONEXAO 2 *********/UPDATE tbIsolationLevel set Col1 = 'DDDDD' where id = 1INSERT INTOtbIsolationLevel(Col1,Col2,Col3)VALUES ('DDDDD','EEEEE','FFFFF')Uma alternativa para evitar LOCK e WAIT nastabelas, e tambem garantir que os dados modificados sejam escritos e nao tenhaleitura suja e o SNAPSHOT. Ele permite tal acaoporque ele copia os dados alterados para a tempdb, possibilitando ler os dadosoriginais durante a transacao, mesmo que eles sejam alterados. Quando umatransacao tem um snapshot, ela coloca uma flag em todos os registros, paragarantir que nao foram alterados. Caso isso ocorra, ela altera a flag.Veja na imagem abaixo a explicacaodeste processo.Com o snapshot habilitado no banco, esetado na transacao, ele le os dados originais da tabela mesmo sofrendomodificacoes por outra transacao.Se os dados lidos nao sofrerem nenhumaalteracao, nada e escrito na tempDB.Porem, se algum dado for modificado, oSQL Server continua lendo a tabela, mas a versao original do dado que foimodificado e copiado para a tempDB e na hora da leitura o SQL se encarrega deler a tempDB e recuperar o dado original. Esta funcionalidade, por padrao, vemdesabilitada do banco de dados, e para utilizar, e necessario habilitar fazendouma alteracao no database. No codigo abaixo, e possivel ver essa alteracao.USE MASTERGOALTER