COD FROM T5 WITH (HOLDLOCK)Umcomando SELECT demonstra os varios bloqueios impostos por essa transacao.Muda o contexto do BancoUSE TempDB;SELECT db_name(resource_database_id) As Banco,T.name As Tabela, request_mode As Modelo,request_session_id As SessaoFROM sys.dm_tran_locks As B INNER JOIN sys.tables As T ON B.resource_associated_entity_id= T.object_idWHERE resource_type = OBJECT AND resource_associated_entity_id> 10ORDERBY TabelaOresultado mostra alguns bloqueios sobre as tabelas da transacao e mostra o SPIDda mesma (no meu caso e 52) Banco Tabela Modelo Sessao tempdb T1 X 52 tempdb T2 X 52 tempdb T3 X 52 tempdb T4 Sch-M 52 tempdb T5 S 52 Umavez que a sessao 52 (minha sessao no SSMS) esteja "segurando" osrecursos, os acessos a esses recursos tendem a ser bloqueados ja que a maioriados bloqueios e exclusiva. O codigo abaixo em C# monta um pequeno aplicativocom 25 conexoes ao banco com o intuito de acessar os recursos que estaobloqueados (T1 a T5).using System;using System.Collections.Generic;using System.Threading;using System.Data.Sql;using System.Data.SqlClient;namespace MB{ class Program { staticvoid Main(string[]args) { Program p= new Program(); string[]strCmds = new string[25]; strCmds[0] = "UPDATE T1 SET COD = COD + 2"; strCmds[1] = "SELECT COD FROM T2 WHERE COD <3"; strCmds[2] = "SELECT COD FROM T2 WHERE COD >2"; strCmds[3] = "DELETE FROM T5"; strCmds[4] = "TRUNCATE TABLE T5"; strCmds[5] = "SELECT COD FROM T4"; strCmds[6] = "UPDATE T2 SET COD = 10 WHERE COD= 1"; strCmds[7] = "SELECT * FROM T1, T2, T3,T5"; strCmds[8] = "DELETE FROM T5 WHERE COD IN(SELECT COD FROM T3)"; strCmds[9] = "TRUNCATE TABLE T1"; strCmds[10]= "SELECT * FROM T2, T4, T5"; strCmds[11]= "DROP TABLE T1"; strCmds[12]= "ALTER TABLE T2 ALTER COLUMN CODCHAR(3)"; strCmds[13]= "UPDATE T3 SET COD = COD +20"; strCmds[14]= "DELETE FROM T2"; strCmds[15]= "SELECT COD FROM T1 WHERE COD >2"; strCmds[16]= "INSERT INTO T1 VALUES (6)"; strCmds[17]= "INSERT INTO T5 VALUES (7)"; strCmds[18]= "INSERT INTO T5 VALUES (8)"; strCmds[19]= "DELETE FROM T1"; strCmds[20]= "DELETE FROM T2"; strCmds[21]= "SELECT COD FROM T1 WITH(XLOCK)"; strCmds[22]= "UPDATE T3 SET COD = 1 WHERE CODIN (SELECT COD FROM T4)"; strCmds[23]= "SELECT COD FROM T1, T4"; strCmds[24]= "INSERT INTO T3 VALUES (10)"; Thread[]trds = new Thread[25]; int i= 0; string vApp= ""; for (i= 0; i < 25; i++) { vApp = "App" +i.ToString("00"); trds[i] = new Thread(delegate() {p.Manipula(strCmds[i], vApp); }); trds[i].Start(); Thread.Sleep(500); } } publicvoid Manipula(string strCmd, string strApp) { try { string strConn= "Server=localhost;Database=TempDb;IntegratedSecurity=SSPI;" + "ConnectTimeout=7200;Application Name=" +strApp + ";"; SqlConnection cn= new SqlConnection(strConn); SqlCommand cmd= cn.CreateCommand(); cmd.CommandTimeout = 7200; cmd.CommandText = strCmd; cn.Open(); cmd.ExecuteNonQuery(); } catch { Console.WriteLine("Umprocesso foi eliminado"); } } }}Comonem sempre o Visual Studio esta disponivel e e necessario compilar o codigo, seo SQL Server estiver instalado, entao necessariamente o .NET Framework tambemestara presente juntamente com o compilador. Para compilar esse codigo, bastaseguir as instrucoes: Abra o Notepad Cole o codigo Salve o arquivo em algum local com aextensao .cs (Ex: H:\MB\MB.cs) Abra um prompt de comando Navegue ate o diretorioC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 (ou superior se houver .NETFramework mais recente) Digite csc /out:H:\MB\MB.exeH:\MB\MB.cs e pressione ENTER (pressupondo que o arquivo seja H:\MB\MB.cs)Ocodigo possui uma matriz com 25 comandos que e executado a cada meio segundo.Como a transacao do SQL Server Management Studio (ID 52)