Vous êtes sur la page 1sur 14

Trabalhando com Isolation Level e Hints

Publicado em: 18/04/2005

Neste artigo vamos tratar de locks e como trabalhar com eles no SQL Server.

Esta semana vamos falar de locks e como trabalhar com eles. O Sql server trabalha com 2 tipos de isolation level (nvel de isolamento), Otimista e Pessimista. O otimista tem como premissa a alta concorrncia entre as conexes, ou seja, todos podem ler, inserir, atualizar e apagar sem nenhuma restrio a outras conexes. possvel ter este tipo de isolao pelo comando:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED


Este tipo de isolamento compara-se ao hint Nolock. Toda a sesso seguir o tipo de isolao at que termine, ou que se mude. Os nveis de isolamento permitem ou no inconsistncias como:

Dirty read quando minha conexo est lendo informaes que ainda no foram comitadas, ou seja, a informao que li pode no existir ou mesmo ter sido modificada. Nonrepeatable read Ocorre quando eu tenho uma transao e nesta transao eu leio a informao mais de uma vez, na primeira leitura veio uma informao e na segunda e demias vieram outras informaes, ou seja, no garanto a consistncia da informao dentro da mesma transao Phanton read Este tipo de inconsistncia ocorre quando eu busco uma informao dentro de uma transao por exemplo por um determinado cep, o sistema me retorna 100 registros, quando dou update apenas 99 so atingidos, entre a leitura e o update 1 registro foi modificado e saiu da clausula WHERE ou foi apagado, poderia tambm ao invs de ser 99 registros atingidos serem 101, 102. Entre o select e o update usurios podem ter inserido registros que foram cobertos pela clausula WHERE. Por isto chamado de phanton ou fantasma, aparecem e somem registros na mesma transao.

No tipo de isolamento Pessimista existe a concorrncia de acessos, e dependendo do tipo de isolamento o grau de concorrncia ser muito baixo, o que pode provocar muitos deadlocks e blocks. READ COMMITED Este o isolation level default usado pelo SQL no Read Commited os registros so bloqueados quando se est fazendo a leitura do mesmo, por isto o tipo de inconsistncia Dirty Read no existe, leio somente informaes comitadas. Ao dar o update tambm o registro bloqueado para a conexo at o commit ou rollback (implcito ou explicito). REPEATABLE READ Este tipo de isolamento segura os registros para a conexo na leitura at o fim da transao, nenhum usurio pode alterar ou apagar estes registros at que a conexo encontre um commit ou rolback (implcito ou explicito), Os Dirtys Reads e NonRepeatable Reads no ocorrem, porm podem ocorrer os phantons. S utilizar este tipo de isolamento quando estritamente necessrio. SERIAZABLE Este o tipo de isolamento mais restrito, este no permite a leitura (select), atualizao (update), insero (insert) ou remoo (delete) de nenhum registro que est sendo lido, at que encontre o commit ou rollback (implcito ou explicito). Os Dirty Reads, NonRepeatable Reads e Phanton no ocorrem. S utilizar este tipo de isolamento quando estritamente necessrio.

Voc pode ver seu isolation level pelo DBCC USEROPTIONS.

Segue tabela de tipos de isolamento e inconsistncias

Dirty Read NonRepeatable Read Phanton READ UNCOMMITED Sim READ COMMITED REPEATABLE READ SERIALIZABLE No No No Sim Sim No No Sim Sim Sim No

Por default o SQL faz todo este trabalho de locking por ns sem precisarmos nos preocupar, apenas em tarefas mais avanadas existe a necessidade de se mudar o ISOLATION level ou usar algum hint. HINTS Os hints nos permitem modificar o comportamento default do SQL sem precisarmos mudar o isolation Level, que mudaria todos os comandos na sesso corrente. So utilizados nos prprios comandos DML, seguem alguns. O sql pode bloquear se necessrio um campo, um registro, um conjunto de registros, uma tabela, uma pgina de 8k, um extended que so 8 pginas de 8k ou o banco de dados inteiro, tudo isto depende de como voc utiliza as queries. Para verificar os locks e tipos de locks utilize a SP_LOCK. Exemplo.

SELECT * FROM Northwind.dbo.Customers

Neste comando eu iria estar dando Block em toda a tabela, porque no especifiquei campos e nem WHERE at o sql me trazer todos os registros. Exemplo.

UPDATE Northwind.dbo.Customers SET ContactName=NULL


Neste comando como o isolation level est default, o sql ir bloquear como exclusivo todos os meus registros at encontrar um rollback ou commit.

O Sql identifica o melhor modo de bloquear de acordo com seu nvel de isolamento, utilizando os modos abaixo: Modo de bloqueio

IS S U IX

Pretende compartilhar Compartilhado Dando update Pretende deixar exclusivo

SIX Compartilhado com inteno de exclusivo X Exclusivo

Tipos de Hints

HOLDLOCK NOLOCK ROWLOCK PAGLOCK TABLOCK READPAST UPDLOCK SERIALIZABLE

Bloqueia os registros at o fim da operao Le todos os registros mesmo os com locking Bloqueia um registro Bloqueia toda a pgina Bloqueia toda a tabela Le apenas os registros comitados e pula os bloquedos Atualiza registros bloqueados O mesmo comportamento do isolation level descrito

REPEATABLEREAD O mesmo comportamento do isolation level descrito READCOMMITED READCOMMITED O mesmo comportamento do isolation level descrito O mesmo comportamento do isolation level descrito

Exemplo especificando hints. Iniciei uma transao pela conexo 51, estou alterando o nome de uma compania no Northwind, iniciei o Begin Tran, mas no tem rollback ou Commit.

Sem resposta, para outras conexes, porque o nvel de isolamento default do SQL (Read Commited) bloqueia o regstro na leitura e na atualizao.

Agora colocando um hint (nolock) possvel ler os registros, como Read uncommited.

Definindo-se o isolation level automaticamente o SQL assume o tipo e lock necessrio para a transao, se voc precisa de um comportamento diferente em apenas alguns comandos, pode utilizar os Hints, mas apenas quando necessrio, indicado tambm que se tome cuidado ao se dar comandos como insert e select porque podem influenciar nos blocks e deadlocks, como tambm acessar e atualizar as tabelas sempre na mesma ordem, como guidline procure dividir os comandos muitos extensos de select e update em pequenos blocos de comandos se possvel. Hints so muito utilizados em sites de grande concorrncia como compra de tickets areos, bolsa de valores etc. At mais. O Sql identifica o melhor modo de bloquear de acordo com seu nvel de isolamento, utilizando os modos abaixo: Modo de bloqueio

IS S U IX

Pretende compartilhar Compartilhado Dando update Pretende deixar exclusivo

SIX Compartilhado com inteno de exclusivo X Exclusivo

Tipos de Hints

HOLDLOCK NOLOCK ROWLOCK PAGLOCK TABLOCK READPAST UPDLOCK SERIALIZABLE

Bloqueia os registros at o fim da operao Le todos os registros mesmo os com locking Bloqueia um registro Bloqueia toda a pgina Bloqueia toda a tabela Le apenas os registros comitados e pula os bloquedos Atualiza registros bloqueados O mesmo comportamento do isolation level descrito

REPEATABLEREAD O mesmo comportamento do isolation level descrito READCOMMITED READCOMMITED O mesmo comportamento do isolation level descrito O mesmo comportamento do isolation level descrito

Exemplo especificando hints. Iniciei uma transao pela conexo 51, estou alterando o nome de uma compania no Northwind, iniciei o Begin Tran, mas no tem rollback ou Commit.

Sem resposta, para outras conexes, porque o nvel de isolamento default do SQL (Read Commited) bloqueia o regstro na leitura e na atualizao.

Agora colocando um hint (nolock) possvel ler os registros, como Read uncommited.

Definindo-se o isolation level automaticamente o SQL assume o tipo e lock necessrio para a transao, se voc precisa de um comportamento diferente em apenas alguns comandos, pode utilizar os Hints, mas apenas quando necessrio, indicado tambm que se tome cuidado ao se dar comandos como insert e select porque podem influenciar nos blocks e deadlocks, como tambm acessar e atualizar as tabelas sempre na mesma ordem, como guidline procure dividir os comandos muitos extensos de select e update em pequenos blocos de comandos se possvel. Hints so muito utilizados em sites de grande concorrncia como compra de tickets areos, bolsa de valores etc. At mais. O Sql identifica o melhor modo de bloquear de acordo com seu nvel de isolamento, utilizando os modos abaixo: Modo de bloqueio

IS S U IX

Pretende compartilhar Compartilhado Dando update Pretende deixar exclusivo

SIX Compartilhado com inteno de exclusivo X Exclusivo

Tipos de Hints

HOLDLOCK NOLOCK ROWLOCK PAGLOCK TABLOCK READPAST UPDLOCK SERIALIZABLE

Bloqueia os registros at o fim da operao Le todos os registros mesmo os com locking Bloqueia um registro Bloqueia toda a pgina Bloqueia toda a tabela Le apenas os registros comitados e pula os bloquedos Atualiza registros bloqueados O mesmo comportamento do isolation level descrito

REPEATABLEREAD O mesmo comportamento do isolation level descrito READCOMMITED READCOMMITED O mesmo comportamento do isolation level descrito O mesmo comportamento do isolation level descrito

Exemplo especificando hints. Iniciei uma transao pela conexo 51, estou alterando o nome de uma compania no Northwind, iniciei o Begin Tran, mas no tem rollback ou Commit.

Sem resposta, para outras conexes, porque o nvel de isolamento default do SQL (Read

Commited) bloqueia o regstro na leitura e na atualizao.

Agora colocando um hint (nolock) possvel ler os registros, como Read uncommited.

Definindo-se o isolation level automaticamente o SQL assume o tipo e lock necessrio para a transao, se voc precisa de um comportamento diferente em apenas alguns comandos, pode utilizar os Hints, mas apenas quando necessrio, indicado tambm que se tome cuidado ao se dar comandos como insert e select porque podem influenciar nos blocks e deadlocks, como tambm acessar e atualizar as tabelas sempre na mesma ordem, como guidline procure dividir os comandos muitos extensos de select e update em pequenos blocos de comandos se possvel. Hints so muito utilizados em sites de grande concorrncia como compra de tickets areos, bolsa de valores etc. At mais. O Sql identifica o melhor modo de bloquear de acordo com seu nvel de isolamento, utilizando os modos abaixo: Modo de bloqueio

IS S U IX

Pretende compartilhar Compartilhado Dando update Pretende deixar exclusivo

SIX Compartilhado com inteno de exclusivo X Exclusivo

Tipos de Hints

HOLDLOCK NOLOCK ROWLOCK PAGLOCK TABLOCK READPAST UPDLOCK SERIALIZABLE

Bloqueia os registros at o fim da operao Le todos os registros mesmo os com locking Bloqueia um registro Bloqueia toda a pgina Bloqueia toda a tabela Le apenas os registros comitados e pula os bloquedos Atualiza registros bloqueados O mesmo comportamento do isolation level descrito

REPEATABLEREAD O mesmo comportamento do isolation level descrito READCOMMITED READCOMMITED O mesmo comportamento do isolation level descrito O mesmo comportamento do isolation level descrito

Exemplo especificando hints. Iniciei uma transao pela conexo 51, estou alterando o nome de uma compania no Northwind, iniciei o Begin Tran, mas no tem rollback ou Commit.

Sem resposta, para outras conexes, porque o nvel de isolamento default do SQL (Read Commited) bloqueia o regstro na leitura e na atualizao.

Agora colocando um hint (nolock) possvel ler os registros, como Read uncommited.

Definindo-se o isolation level automaticamente o SQL assume o tipo e lock necessrio para a transao, se voc precisa de um comportamento diferente em apenas alguns comandos, pode utilizar os Hints, mas apenas quando necessrio, indicado tambm que se tome cuidado ao se dar comandos como insert e select porque podem influenciar nos blocks e deadlocks, como tambm acessar e atualizar as tabelas sempre na mesma ordem, como guidline procure dividir os comandos muitos extensos de select e update em pequenos blocos de comandos se possvel. Hints so muito utilizados em sites de grande concorrncia como compra de tickets areos, bolsa de valores etc. At mais.

Fonte: http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=666

Vous aimerez peut-être aussi