Se eu tiver um procedimento armazenado com set transaction isolation level read uncommitted
, isso afetará as instruções de atualização?
Eu sei que você não deve usar with (nolock)
instruções on update/delete, e isso faz praticamente a mesma coisa, mas não tenho certeza se o SQL o ignora nas instruções update no procedimento ou se devo ter cuidado para não usá-lo se houver instruções update.
EDITAR:
Desculpe pela confusão. Não estou tentando descobrir qual seria o efeito de usar esse tipo de bloqueio em instruções de manipulação ou se é uma boa ideia. Na verdade, NÃO quero usar esse tipo de bloqueio nas instruções de manipulação e, portanto, minha pergunta é se colocar "definir transação ..." no topo do meu procedimento armazenado será honrado por instruções de atualização/exclusão ou se será ignorado. Minha esperança é que seja simplesmente ignorado.
Estou plenamente ciente dos efeitos (com seus prós e contras) que isso terá nas declarações selecionadas.
Leitura não confirmada permite leituras sujas. Um
X
bloqueio será obtido na linha ou no nível superior (na página de dados ou no índice) antes de ficar sujo. As linhas acessadas diretamente pela consulta ao localizar uma linha para atualizar receberão umU
bloqueio e serão bloqueadas.No entanto, ainda é possível que uma atualização seja afetada pelo nível de isolamento.
Conexão 1
Conexão 2 (execute isso dentro de 10 segundos após disparar a conexão 1)
Resultado
A operação de leitura lia o valor não confirmado e o resultado final era usado
UPDATE
mesmo que o100
que foi lido fosse eventualmente revertido."Nível de isolamento da transação" afeta principalmente (no meu entendimento) o comportamento da operação de leitura, ou seja, se uma operação de leitura emitirá alguns bloqueios. No caso de "ler não confirmado", aqui está uma citação do MSDN
Portanto, para sua pergunta, a resposta é NÃO, a atualização não será afetada pelo nível de isolamento de transação "ler não confirmado" dentro do mesmo procedimento armazenado.
-- Update (uma amostra para provar essa lógica) No SSMS, abrimos duas janelas e, na Janela 1 (W1 daqui em diante), executamos o seguinte
Em outra janela (W2), execute o seguinte (consulte os comentários para o comportamento)
Isso significa que a instrução UPDATE em W2 (com READ UNCOMMITTED) não é afetada pelo nível de isolamento da transação (isto é, ainda se comporta como esperado) como a instrução SELECT.
-- UPDATE 2: De acordo com MSDN UPDATE t-sql,
Portanto, meu entendimento é que, quando você executa a instrução UPDATE, no SQL Server, não há como atualizar dados sujos (ou seja, dados não confirmados), mesmo que você possa ler os dados sujos em sua sessão.
Com base na sua edição, agora a dúvida ficou mais clara..
O nível de isolamento da transação deve ser pensado em termos de operações de leitura. Os níveis de isolamento controlam como as operações de leitura são protegidas das outras operações de gravação.
O mecanismo de banco de dados controla o comportamento de bloqueio de todas as operações de gravação e você não pode alterar esse comportamento no nível do banco de dados.
De BOL :
Leia :