{"id":942,"date":"2017-05-30T15:38:43","date_gmt":"2017-05-30T15:38:43","guid":{"rendered":"https:\/\/www.tiagoneves.net\/blog\/?p=942"},"modified":"2017-05-30T18:57:39","modified_gmt":"2017-05-30T18:57:39","slug":"isolation-level-no-sql-server","status":"publish","type":"post","link":"https:\/\/www.tiagoneves.net\/blog\/isolation-level-no-sql-server\/","title":{"rendered":"Isolation Level no SQL Server"},"content":{"rendered":"<p style=\"text-align: justify;\">Ol\u00e1 pessoal, tudo certo?<\/p>\n<p style=\"text-align: justify;\">Depois de um tempo sem postar nada t\u00e9cnico estamos de volta. No post de hoje quero tentar explicar um pouco sobre n\u00edveis de isolamento do SQL Server.<\/p>\n<p style=\"text-align: justify;\">O comportamento entre duas transa\u00e7\u00f5es simult\u00e2neas depende da configura\u00e7\u00e3o do n\u00edvel de isolamento configurado. No SQL Server temos 5 n\u00edveis de isolamento, READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SNAPSHOT e SERIALIZABLE.<\/p>\n<p style=\"text-align: justify;\"><strong>READ UNCOMMITTED<\/strong><\/p>\n<p style=\"text-align: justify;\">\u00c9 o n\u00edvel de isolamento mais brando pois permite que ocorra leitura de dados que foram modificados por outras transa\u00e7\u00f5es, mas ainda n\u00e3o foram confirmados, ou seja, voc\u00ea consegue ler dados que ainda n\u00e3o foram comitados no banco. Esse n\u00edvel de isolamento reduz a quantidade de locks no banco.<\/p>\n<p style=\"text-align: justify;\">\u00c9 bastante comum ver desenvolvedores utilizando o hint (<span style=\"color: #3366ff;\">NOLOCK<\/span>), que na pr\u00e1tica faz o mesmo papel do n\u00edvel de isolamento READ UNCOMMITTED.<\/p>\n<p style=\"text-align: justify;\">Exemplo:<\/p>\n<p style=\"text-align: justify;\">Vamos abrir uma transa\u00e7\u00e3o e executar um update.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">BEGIN TRAN\r\nUPDATE A\r\nSET A.Title = 'DR.' \r\nFROM AdventureWorks.Person.Person A\r\nWHERE a.BusinessEntityID = 16113<\/pre>\n<p style=\"text-align: justify;\">\u00a0Agora em outra sess\u00e3o vamos executar um select simples na tabela AdventureWorks.Person.Person<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">SELECT * \r\nFROM AdventureWorks.Person.Person \r\n<\/pre>\n<p style=\"text-align: justify;\">Na imagem a baixo podemos verificar que a consulta retornou dados at\u00e9 chegar na p\u00e1gina que foi bloqueada pela transa\u00e7\u00e3o 1.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-946\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?resize=678%2C235&#038;ssl=1\" alt=\"\" width=\"678\" height=\"235\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?w=1488&amp;ssl=1 1488w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?resize=300%2C104&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?resize=768%2C266&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?resize=1024%2C355&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-947\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=678%2C27&#038;ssl=1\" alt=\"\" width=\"678\" height=\"27\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?w=1642&amp;ssl=1 1642w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=300%2C12&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=768%2C31&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=1024%2C41&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>A sess\u00e3o 53, que executa o select est\u00e1 sendo bloqueada pela transa\u00e7\u00e3o 1 (sess\u00e3o 51) que est\u00e1 com a transa\u00e7\u00e3o aberta.<\/p>\n<p>Agora vamos ver o que ocorre quando o n\u00edvel de isolamento \u00e9 alterado para READ UNCOMMITTED.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED\r\n\r\nSELECT * \r\nFROM AdventureWorks.Person.Person \r\nWHERE BusinessEntityID =16113\r\n<\/pre>\n<p style=\"text-align: justify;\">Como podemos verificar na imagem abaixo, o select retornou o registro<span style=\"text-decoration: line-through;\">,<\/span> sem gerar nenhum lock, por\u00e9m a sess\u00e3o 54 fez uma leitura suja do dado, uma vez que a transa\u00e7\u00e3o 51 ainda est\u00e1 aberta e n\u00e3o realizou o COMMIT.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-948\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?resize=678%2C39&#038;ssl=1\" alt=\"\" width=\"678\" height=\"39\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?w=1821&amp;ssl=1 1821w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?resize=300%2C17&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?resize=768%2C45&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?resize=1024%2C60&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Sessao_Alterada_Para_READUNCOMMITED.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-951\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?resize=678%2C20&#038;ssl=1\" alt=\"\" width=\"678\" height=\"20\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?w=1579&amp;ssl=1 1579w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?resize=300%2C9&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?resize=768%2C22&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?resize=1024%2C30&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_sp_Whoisactive.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Vamos simular que o usu\u00e1rio da sess\u00e3o 51, percebeu que estava alterando um dado do cadastro errado e cancela aquela altera\u00e7\u00e3o (realiza um ROLLBACK).<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-950\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?resize=678%2C27&#038;ssl=1\" alt=\"\" width=\"678\" height=\"27\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?w=1418&amp;ssl=1 1418w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?resize=300%2C12&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?resize=768%2C31&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?resize=1024%2C41&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Rollback.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">O dado que o usu\u00e1rio da sess\u00e3o 54 leu anteriormente agora n\u00e3o est\u00e1 de acordo com o que est\u00e1 no banco de dados. Embora o exemplo utilizado seja bastante simples e n\u00e3o geraria impacto, outros cen\u00e1rios poderiam trazer grandes impactos e preju\u00edzos.<\/p>\n<p><strong>READ COMMITTED<\/strong><\/p>\n<p style=\"text-align: justify;\">\u00c9 o modo padr\u00e3o do SQL Server, ele garante que somente seja realizada leitura de dados confirmados (COMMIT), isso impede o risco de leituras sujas ao contr\u00e1rio do READ UNCOMMITTED. Em compensa\u00e7\u00e3o aumenta o n\u00famero de bloqueios (locks) nas transa\u00e7\u00f5es.<\/p>\n<p style=\"text-align: justify;\">No caso abaixo, vamos fazer um update na transa\u00e7\u00e3o 01 e na transa\u00e7\u00e3o 02 vamos fazer uma consulta dos dados.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">--Transa\u00e7\u00e3o 01\r\nBEGIN TRAN \r\nUPDATE A\r\nSET A.Title = 'DR.'\r\nFROM AdventureWorks.Person.Person A\r\nWHERE a.BusinessEntityID = 16113\r\n<\/pre>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">--Transa\u00e7\u00e3o 02\r\nSELECT *\r\nFROM AdventureWorks.Person.Person A \r\nWHERE a.BusinessEntityID = 16113\r\n<\/pre>\n<p>A transa\u00e7\u00e3o 02 ficou bloqueada, pois o registro que est\u00e1 sendo consultado estava sendo atualizado pela transa\u00e7\u00e3o 01.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-947\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=678%2C27&#038;ssl=1\" alt=\"\" width=\"678\" height=\"27\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?w=1642&amp;ssl=1 1642w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=300%2C12&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=768%2C31&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?resize=1024%2C41&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_Bloqueado_sp_Whoisactive.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">O comportamento do READ COMMITTED pode ser alterado. Caso seja habilitado a op\u00e7\u00e3o READ_COMMITTED_SNAPSHOT como ON, o SQL Server vai come\u00e7ar a criar um versionamento dos dados, sendo poss\u00edvel fazer a leitura dos dados sem sofrer bloqueio de outra transa\u00e7\u00e3o que esteja fazendo uma altera\u00e7\u00e3o. Quando voc\u00ea efetuar a leitura ser\u00e1 retornado o dado que estava comitado no banco.<\/p>\n<p style=\"text-align: justify;\">Para utilizar o READ_COMMITTED_SNAPSHOT, devemos alterar a propriedade no banco e n\u00e3o na sess\u00e3o como os n\u00edveis anteriores.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON<\/pre>\n<p style=\"text-align: justify;\">A diferen\u00e7a entre o READ_COMMITTED_SNAPSHOT e o READ UNCOMMITTED \u00e9 que o READ_COMMITTED_SNAPSHOT voc\u00ea n\u00e3o faz leitura dos dados n\u00e3o comitados. Nesse caso, a leitura dos dados que est\u00e3o sendo atualizados \u00e9 realizada na vers\u00e3o que est\u00e1 no Tempdb. Devemos ficar atentos pois quando utilizamos a propriedade READ_COMMITTED_SNAPSHOT o SQL Server vai come\u00e7ar a fazer o versionamento utilizando o Tempdb, o que pode ocasionar conten\u00e7\u00e3o.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">BEGIN TRAN\r\n\r\nUPDATE A\r\nSET A.Title = 'DR.'\r\nFROM AdventureWorks.Person.Person A\r\n<\/pre>\n<p>No exemplo abaixo, repare no tamanho utilizado pelo \u201cVersion Store\u201d.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-952\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb.png?resize=405%2C57&#038;ssl=1\" alt=\"\" width=\"405\" height=\"57\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb.png?w=405&amp;ssl=1 405w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb.png?resize=300%2C42&amp;ssl=1 300w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/a><\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">--Transa\u00e7\u00e3o 02\r\n\r\nSELECT *\r\nFROM AdventureWorks.Person.Person A\r\n<\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-953\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=678%2C269&#038;ssl=1\" alt=\"\" width=\"678\" height=\"269\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?w=1268&amp;ssl=1 1268w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=300%2C119&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=768%2C305&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=1024%2C406&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p><strong>REPEATABLE READ<\/strong><\/p>\n<p style=\"text-align: justify;\">Este n\u00edvel de isolamento \u00e9 mais restritivo que READ COMMITTED, pois ele faz o bloqueio de um registro que est\u00e1 sendo lido, n\u00e3o permitindo que outras sess\u00f5es consigam ler, inserir ou alterar dados que estejam sendo bloqueados, este n\u00edvel impede a leitura suja e registros fantasmas. Este n\u00edvel deve ser utilizado somente quando necess\u00e1rio, pois pode gerar uma grande quantidade de locks no banco.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">SET TRANSACTION ISOLATION LEVEL REPEATABLE READ<\/pre>\n<p>Agora na transa\u00e7\u00e3o 01, vamos fazer uma consulta alterando o n\u00edvel de isolamento da sess\u00e3o para REPEATABLE READ.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">SET TRANSACTION ISOLATION LEVEL REPEATABLE READ\r\n\r\nBegin tran\r\nSELECT *\r\nFROM AdventureWorks.Person.Person A\r\n<\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-953\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=678%2C269&#038;ssl=1\" alt=\"\" width=\"678\" height=\"269\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?w=1268&amp;ssl=1 1268w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=300%2C119&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=768%2C305&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Select_RCSI.png?resize=1024%2C406&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Na transa\u00e7\u00e3o 02 vamos efetuar um update no registro com BusinessEntityID = 16113, vamos verificar que a transa\u00e7\u00e3o 02 vai ficar bloqueada.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">--Transa\u00e7\u00e3o 02\r\n\r\nUPDATE A\r\nSET A.Title = 'DR.'\r\nFROM AdventureWorks.Person.Person A\r\nWHERE a.BusinessEntityID = 16113\r\n<\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-954\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=678%2C34&#038;ssl=1\" alt=\"\" width=\"678\" height=\"34\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?w=1228&amp;ssl=1 1228w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=300%2C15&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=768%2C39&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=1024%2C52&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p><strong>SNAPSHOT<\/strong><\/p>\n<p style=\"text-align: justify;\"><strong>\u00a0<\/strong>Este n\u00edvel de isolamento tamb\u00e9m \u00e9 uma alternativa para evitar locks nas tabelas e evita leitura de dados sujos, pois ele cria um versionamento dos dados alterados no tempdb.<\/p>\n<p style=\"text-align: justify;\">Quando o banco e a sess\u00e3o est\u00e3o com o SNAPSHOT habilitado, quando ele vai fazer uma leitura de dados que por ventura esteja sendo alterado por outra sess\u00e3o ele busca esse dado na vers\u00e3o que est\u00e1 armazenada no tempdb. Este n\u00edvel de isolamento pode gerar um grande gargalo no tempdb.<\/p>\n<p style=\"text-align: justify;\">Para melhor entendimento, vou utilizar a ilustra\u00e7\u00e3o que o Diego Nogare fez em seu post (<a href=\"http:\/\/www.diegonogare.net\/2013\/01\/transaction-isolation-level-voc-est-usando-certo\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.diegonogare.net\/2013\/01\/transaction-isolation-level-voc-est-usando-certo\/<\/a>)<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Version_Tempdb.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-955\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Version_Tempdb.png?resize=540%2C469&#038;ssl=1\" alt=\"\" width=\"540\" height=\"469\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Version_Tempdb.png?w=540&amp;ssl=1 540w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Version_Tempdb.png?resize=300%2C261&amp;ssl=1 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/a><\/p>\n<p>Para habilitar o n\u00edvel de isolamento SNAPSHOT no banco basta executar o comando abaixo:<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON<\/pre>\n<p style=\"text-align: justify;\">No exemplo abaixo \u00e9 demonstrado o que acontece quando utilizamos n\u00edvel de isolamento SNAPSHOT:<\/p>\n<p style=\"text-align: justify;\">Podemos verificar que o Tempdb est\u00e1 8 MB.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_8.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-956\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_8.png?resize=399%2C103&#038;ssl=1\" alt=\"\" width=\"399\" height=\"103\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_8.png?w=399&amp;ssl=1 399w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_8.png?resize=300%2C77&amp;ssl=1 300w\" sizes=\"auto, (max-width: 399px) 100vw, 399px\" \/><\/a><\/p>\n<p>Agora vamos executar um update sem where na tabela Person.Person<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">--Transa\u00e7\u00e3o 01\r\nBEGIN TRAN\r\n\r\nUPDATE A\r\nSET A.Title = 'DR.'\r\nFROM AdventureWorks.Person.Person A\r\n<\/pre>\n<p style=\"text-align: justify;\">O Tempdb aumentou o seu tamanho para 73 MB e criou uma vers\u00e3o da tabela, se executarmos um select na tabela Person.Person, vamos conseguir fazer a leitura dos dados, mesmo com a transa\u00e7\u00e3o 01 aberta, porem a leitura dos dados que n\u00e3o foram modificados \u00e9 realizada atrav\u00e9s da vers\u00e3o dos dados que est\u00e3o no Tempdb, como no exemplo realizamos um update na tabela toda, ent\u00e3o toda leitura foi realizada no Tempdb.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true \">--Transa\u00e7\u00e3o 02\r\nSET TRANSACTION ISOLATION LEVEL SNAPSHOT\r\nSELECT * FROM Person.Person \r\n<\/pre>\n<p>Ap\u00f3s o COMMIT ou ROLLBACK da transa\u00e7\u00e3o 01 os dados s\u00e3o liberados e voltam a ser lidos atrav\u00e9s da tabela.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_COMMIT_or_ROLLBACK.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-957\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_COMMIT_or_ROLLBACK.png?resize=379%2C101&#038;ssl=1\" alt=\"\" width=\"379\" height=\"101\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_COMMIT_or_ROLLBACK.png?w=379&amp;ssl=1 379w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_SNAPSHOT_Tempdb_COMMIT_or_ROLLBACK.png?resize=300%2C80&amp;ssl=1 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Quando for utilizar o SNAPSHOT use com cuidado pois voc\u00ea pode se livrar de um problema e entrar em outro, como podemos ver a sua utiliza\u00e7\u00e3o pode gerar uma carga maior no Tempdb.<\/p>\n<p><strong>SERIALIZABLE<\/strong><\/p>\n<p style=\"text-align: justify;\"><strong>\u00a0<\/strong>\u00c9 o n\u00edvel de isolamento mais restritivo.<\/p>\n<p style=\"text-align: justify;\">Uma transa\u00e7\u00e3o n\u00e3o consegue ler dados, que est\u00e3o sendo modificado no momento e n\u00e3o foram confirmados (leitura suja), tamb\u00e9m n\u00e3o \u00e9 poss\u00edvel inserir dados em um intervalo de dados que tenha sido lido por outra transa\u00e7\u00e3o (leitura fantasma).<\/p>\n<p style=\"text-align: justify;\">Como podemos verificar abaixo, quando definimos o isolamento SERIALIZABLE e efetuamos uma consulta, ela gera um lock impedindo que a transa\u00e7\u00e3o 02, realize um update.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">--Transa\u00e7\u00e3o 01\r\n\r\nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE\r\n\r\nBEGIN TRAN\r\nSELECT *\r\nFROM AdventureWorks.Person.Person A \r\n<\/pre>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">--Transa\u00e7\u00e3o 02\r\n\r\nBEGIN TRAN\r\n\r\nUPDATE A\r\nSET A.Title = 'DR.'\r\nFROM AdventureWorks.Person.Person A\r\nWHERE a.BusinessEntityID = 16113\r\n<\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?ssl=1\" rel=\"lightbox[942]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-954\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=678%2C34&#038;ssl=1\" alt=\"\" width=\"678\" height=\"34\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?w=1228&amp;ssl=1 1228w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=300%2C15&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=768%2C39&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2017\/05\/Isolation_Level_Update_Bloqueado_sp_Whoisactive_Serializable.png?resize=1024%2C52&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Para finalizar, n\u00e3o existe uma f\u00f3rmula m\u00e1gica para dizer qual \u00e9 o melhor n\u00edvel de isolamento. Isso varia de acordo com o seu ambiente. Voc\u00ea como DBA deve ter a habilidade de entender qual \u00e9 o n\u00edvel de isolamento mais adequado para aplicar no seu ambiente e ter em mente que \u201cn\u00e3o existe almo\u00e7o gr\u00e1tis&#8230; \u201c, como o <em>Edvaldo Castro<\/em> diz em seu post (<a href=\"http:\/\/edvaldocastro.com\/rcsi-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/edvaldocastro.com\/rcsi-2\/<\/a>).<\/p>\n<p style=\"text-align: justify;\">O ideal \u00e9 que voc\u00ea conhe\u00e7a cada um deles analisando os pontos positivos e negativos e tamb\u00e9m o seu ambiente, para assim, aplicar o n\u00edvel de isolamento que mais se enquadra na sua situa\u00e7\u00e3o.<\/p>\n<p style=\"text-align: justify;\">Espero ter ajudado a entender os n\u00edveis de isolamento.<\/p>\n<p><em>Referencias:<\/em><\/p>\n<p>Pro SQL Server Internals \u2013 Segunda edi\u00e7\u00e3o \u2013 Dmitri Korotkevitch<br \/>\nMicrosoft SQL Server 2012 Internals \u2013 Kalen Delaney<\/p>\n<p><a href=\"https:\/\/msdn.microsoft.com\/pt-br\/library\/ms173763.aspx\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/msdn.microsoft.com\/pt-br\/library\/ms173763.aspx<\/a><br \/>\n<a href=\"https:\/\/www.brentozar.com\/archive\/2013\/01\/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.brentozar.com\/archive\/2013\/01\/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide\/<\/a><br \/>\n<a href=\"https:\/\/www.simple-talk.com\/sql\/t-sql-programming\/questions-about-t-sql-transaction-isolation-levels-you-were-too-shy-to-ask\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.simple-talk.com\/sql\/t-sql-programming\/questions-about-t-sql-transaction-isolation-levels-you-were-too-shy-to-ask\/<\/a><br \/>\n<a href=\"https:\/\/www.mssqltips.com\/sqlservertip\/2977\/demonstrations-of-transaction-isolation-levels-in-sql-server\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.mssqltips.com\/sqlservertip\/2977\/demonstrations-of-transaction-isolation-levels-in-sql-server\/<\/a><br \/>\n<a href=\"http:\/\/edvaldocastro.com\/rcsi-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/edvaldocastro.com\/rcsi-2\/<\/a><br \/>\n<a href=\"http:\/\/www.diegonogare.net\/2013\/01\/transaction-isolation-level-voc-est-usando-certo\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.diegonogare.net\/2013\/01\/transaction-isolation-level-voc-est-usando-certo\/<\/a><\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Tiago Neves<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 pessoal, tudo certo? Depois de um tempo sem postar nada t\u00e9cnico estamos de volta. No post de hoje quero tentar explicar um pouco sobre n\u00edveis de isolamento do SQL Server. O comportamento entre duas transa\u00e7\u00f5es simult\u00e2neas depende da configura\u00e7\u00e3o do n\u00edvel de isolamento configurado. No SQL Server temos 5 n\u00edveis de isolamento, READ UNCOMMITTED, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rop_custom_images_group":[],"rop_custom_messages_group":[],"rop_publish_now":"initial","rop_publish_now_accounts":{"twitter_91251433_91251433":""},"rop_publish_now_history":[],"rop_publish_now_status":"pending","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpscppro_dont_share_socialmedia":false,"_wpscppro_custom_social_share_image":0,"_facebook_share_type":"","_twitter_share_type":"","_linkedin_share_type":"","_pinterest_share_type":"","_linkedin_share_type_page":"","_instagram_share_type":"","_medium_share_type":"","_threads_share_type":"","_google_business_share_type":"","_selected_social_profile":[],"_wpsp_enable_custom_social_template":false,"_wpsp_social_scheduling":{"enabled":false,"datetime":null,"platforms":[],"status":"template_only","dateOption":"today","timeOption":"now","customDays":"","customHours":"","customDate":"","customTime":"","schedulingType":"absolute"},"_wpsp_active_default_template":true},"categories":[20,138],"tags":[192,193,190,191,35],"class_list":["post-942","post","type-post","status-publish","format-standard","hentry","category-sqlserver-geral","category-troubleshooting","tag-acid","tag-isolamento","tag-isolations-levels","tag-niveis-de-isolamento","tag-sql-server"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6eIyh-fc","jetpack-related-posts":[{"id":2414,"url":"https:\/\/www.tiagoneves.net\/blog\/sql-server-2016-esta-chegando-ao-fim-do-suporte-o-que-isso-significa-na-pratica\/","url_meta":{"origin":942,"position":0},"title":"SQL Server 2016 est\u00e1 chegando ao fim do suporte: o que isso significa na pr\u00e1tica?","author":"tiagoneves","date":"27 de abril de 2026","format":false,"excerpt":"O SQL Server 2016 ter\u00e1 seu suporte estendido encerrado em 14 de julho de 2026, o que resultar\u00e1 na falta de atualiza\u00e7\u00f5es de seguran\u00e7a e suporte. Continuar usando essa vers\u00e3o traz riscos como vulnerabilidades e n\u00e3o conformidade regulat\u00f3ria. Planejar a migra\u00e7\u00e3o para vers\u00f5es mais recentes ou cloud deve ser prioridade\u2026","rel":"","context":"Em &quot;Seguran\u00e7a&quot;","block_context":{"text":"Seguran\u00e7a","link":"https:\/\/www.tiagoneves.net\/blog\/category\/seguranca\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=700%2C400 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/comments?post=942"}],"version-history":[{"count":7,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/942\/revisions"}],"predecessor-version":[{"id":961,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/942\/revisions\/961"}],"wp:attachment":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media?parent=942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/categories?post=942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/tags?post=942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}