SQL Server 2025: Como o OPTIMIZED_LOCKING Pode Finalmente Resolver o Maior Problema do Lock Escalation
Durante décadas, um dos maiores problemas do SQL Server em ambientes OLTP sempre foi o mesmo:
concorrência.
Quem administra sistemas transacionais grandes conhece perfeitamente o cenário:
- blocking
- deadlocks
- lock escalation
- filas travadas
- aplicações congelando
E o mais curioso é que muita gente nunca entendeu o verdadeiro motivo do SQL Server fazer lock escalation.
A maioria pensa apenas:
“passou de 5000 linhas atualizadas e virou table lock.”
Mas o problema real é muito mais profundo.
O verdadeiro motivo do Lock Escalation
O SQL Server sempre foi um banco extremamente baseado em locking pessimista.
Isso significa:
quando uma transação altera linhas, o engine mantém locks ativos até o COMMIT.
Exemplo:
BEGIN TRAN
UPDATE Pedidos
SET Status = 'F'
WHERE Data < '2024-01-01'
COMMIT
Se essa query atualizar:
- 100 mil linhas
o SQL Server pode manter:
- dezenas ou centenas de milhares de row locks
ativos simultaneamente.
E isso custa memória.
Muita memória.
O detalhe que quase ninguém comenta
Cada lock possui estrutura interna dentro do Lock Manager.
Então imagine:
- milhares de sessões
- milhões de row locks
- transações concorrentes
O consumo de memória pode explodir rapidamente.
E foi justamente para evitar isso que nasceu o:
LOCK ESCALATION.
O famoso “5000 locks”
Muita gente fala:
“passou de 5000 rows o SQL Server faz escalation.”
Tecnicamente não é exatamente linhas.
O SQL Server analisa:
- quantidade de locks
- pressão de memória
- contexto da transação
Mas sim:
por volta de 5000 locks o engine frequentemente tenta converter:
- row locks
- key locks
- page locks
em:
- TABLE LOCK.
E aqui nasce o verdadeiro problema.
O trade-off histórico do SQL Server
O SQL Server sempre viveu preso em um dilema.
Cenário 1
Manter:
- milhares de row locks
Problema:
- consumo absurdo de memória
- pressão no Lock Manager
- overhead interno
Cenário 2
Fazer TABLE LOCK
Problema:
- bloqueia toda a tabela
- destrói concorrência
- gera blocking massivo
Era literalmente uma troca entre:
- memória
ou - concorrência.
E sim… existiam trace flags para tentar resolver isso
Muitos DBAs experientes usavam:
- Trace Flag 1211
- Trace Flag 1224
para impedir ou reduzir lock escalation.
A ideia era simples:
“prefiro manter row locks do que bloquear a tabela inteira.”
Só que isso tinha um custo perigosíssimo.
Porque sem escalation…
o SQL Server podia manter:
- milhões de locks simultâneos.
E isso consumia MUITA memória RAM.
Em ambientes antigos isso inclusive podia gerar:
- instabilidade
- pressão de memória
- degradação severa do servidor
Então durante muitos anos o DBA precisava escolher:
- mais memória
ou - mais blocking.
E é exatamente aqui que entra o SQL Server 2025
O novo:
ALTER DATABASE MinhaBase
SET OPTIMIZED_LOCKING = ON;
não é apenas uma feature pequena.
Ele muda completamente a filosofia do engine de concorrência do SQL Server.
O que o OPTIMIZED_LOCKING faz de diferente
Historicamente o SQL Server fazia isso:
- pega row lock
- mantém lock até COMMIT
- acumula milhares de locks
- faz escalation
Agora o comportamento mudou.
Com o novo modelo:
o engine tenta:
- liberar rapidamente os row locks
- e manter apenas um lock lógico da transação
Esse mecanismo é chamado:
TID Locking.
A genialidade do TID Locking
Antes:
100 mil linhas atualizadas
=
100 mil row locks ativos
Agora:
o SQL Server modifica a linha…
libera rapidamente o row lock…
e mantém apenas um identificador lógico da transação.
Resultado:
a quantidade de locks simultâneos despenca.
E aqui está o ponto mais importante:
👉 se você não acumula milhares de locks…
você praticamente elimina a CAUSA do lock escalation.
O OPTIMIZED_LOCKING substitui lock escalation?
Não totalmente.
O mecanismo ainda existe.
Mas agora ele é necessário MUITO menos frequentemente.
Porque o SQL Server não precisa mais manter milhões de locks vivos simultaneamente.
Ou seja:
a feature não “desliga” escalation.
Ela reduz drasticamente a necessidade dele acontecer.
E isso é muito mais inteligente.
O segundo mecanismo revolucionário: LAQ
Além do TID Locking, o SQL Server 2025 introduziu:
LAQ — Lock After Qualification.
Historicamente:
o SQL Server muitas vezes pegava lock antes mesmo de validar se a linha realmente precisaria ser modificada.
Agora:
ele primeiro verifica a elegibilidade da linha usando row versioning…
e só depois aplica o lock se realmente precisar alterar o dado.
Isso reduz:
- blocking
- waits
- contenção
- lock desnecessário
O SQL Server está mudando de arquitetura
Isso é extremamente importante.
Durante décadas o SQL Server foi altamente dependente de locking pessimista.
Agora ele está claramente migrando para:
- optimistic concurrency
- row versioning
- menos retenção de locks
- menos dependência de escalation
Muito parecido com o que:
- Oracle
- PostgreSQL
já fazem há muitos anos.
Então acabou o blocking?
Não.
Isso é importante.
Ainda existem:
- schema locks
- metadata locks
- latch contention
- log flush waits
- transaction dependencies
Além disso:
queries usando:
- SERIALIZABLE
- HOLDLOCK
- UPDLOCK
- XLOCK
continuam reduzindo bastante os benefícios da feature.
O impacto real no SQL Server Standard
E aqui está outro detalhe gigantesco.
No SQL Server Standard:
muitos ambientes sofrem absurdamente com blocking durante:
- UPDATE massivo
- DELETE grande
- manutenção pesada
Porque qualquer escalation para TABLE LOCK pode congelar aplicações inteiras.
O OPTIMIZED_LOCKING pode reduzir muito isso.
E sinceramente?
Essa talvez seja uma das maiores melhorias de concorrência já feitas para workloads OLTP no SQL Server Standard.
Mas existe um detalhe perigoso
Muita gente vai ativar:
OPTIMIZED_LOCKING = ON
achando que virou mágica.
E definitivamente não é assim.
Porque essa feature altera o núcleo de concorrência do SQL Server.
Ela mexe literalmente:
- no Lock Manager
- no comportamento transacional
- na estratégia interna de retenção de locks
E isso exige:
- benchmark
- replay de workload
- monitoramento
- análise de waits
- análise de deadlocks
O SQL Server entrou em uma nova era
Historicamente o maior gargalo era:
- I/O
Depois:
- CPU
Hoje:
o gargalo cada vez mais é concorrência.
E o OPTIMIZED_LOCKING claramente mostra que a Microsoft finalmente começou a modernizar profundamente o mecanismo interno de concorrência do SQL Server.
Mas atenção…
👉 para o recurso entregar o potencial máximo dele…
o ideal é usar:
ALTER DATABASE MinhaBase
SET READ_COMMITTED_SNAPSHOT ON;
Porque o OPTIMIZED_LOCKING depende fortemente de:
- row versioning
- leitura otimista
- visibilidade transacional baseada em versões
Sem RCSI, parte importante da mágica simplesmente não acontece.
O que muda com RCSI
No SQL Server tradicional:
READ COMMITTED usa locking clássico.
Então:
- SELECT pega shared lock
- UPDATE pega exclusive lock
- ambos podem bloquear um ao outro
Exemplo clássico:
- usuário lendo
- outro atualizando
- blocking acontecendo
Com READ_COMMITTED_SNAPSHOT ON
O comportamento muda completamente.
O SELECT:
- não lê mais diretamente a linha bloqueada
- ele lê uma versão anterior da linha no version store do tempdb
Ou seja:
- leitura não bloqueia escrita
- escrita não bloqueia leitura
Isso sozinho já reduz MUITO blocking.
E por que isso é importante para o OPTIMIZED_LOCKING?
Porque o novo mecanismo:
- TID Locking
- LAQ (Lock After Qualification)
foi desenhado assumindo que o SQL Server pode confiar em row versioning.
Especialmente o:
LAQ.
Porque o SQL Server agora tenta:
- validar a linha primeiro
- usando versões
- sem bloquear imediatamente
Sem RCSI:
o engine ainda precisa usar muito mais locking tradicional.
Então o OPTIMIZED_LOCKING funciona sem RCSI?
Sim.
Mas perde parte importante dos benefícios.
A Microsoft até fala isso de forma indireta na documentação.
Sem:
- RCSI
- ADR
o ganho é menor.
Porque o SQL Server ainda fica preso em vários comportamentos pessimistas tradicionais.
O detalhe MAIS importante
Muita gente acha que:
“RCSI é só para SELECT não bloquear UPDATE”.
Mas não.
RCSI muda profundamente:
- a filosofia de concorrência do banco
- o comportamento transacional
- a retenção de locks
- o modelo interno de leitura
E agora no SQL Server 2025…
isso virou ainda mais importante.
Porque o engine novo foi claramente desenhado para um mundo mais:
- optimistic
- versioned
- menos lock-based
Então o SQL Server está virando MVCC igual Oracle/Postgres?
Quase isso.
Mas ainda não totalmente.
Oracle e PostgreSQL nasceram:
- version-based
- MVCC-first
O SQL Server nasceu:
- lock-first
- pessimistic-first
Agora ele está evoluindo para um modelo híbrido.
E sinceramente?
O SQL Server 2025 talvez seja a maior mudança nessa direção desde o lançamento do Snapshot Isolation lá atrás.
Mas existe um custo importante
RCSI não é “grátis”.
Porque agora o SQL Server precisa manter versões das linhas no:
- tempdb version store
Então você aumenta:
- escrita no tempdb
- uso de disco/tempdb
- memória
- cleanup interno de versões
Em workloads extremamente pesados isso pode virar outro gargalo.
Então vale a pena?
Na maioria dos ambientes OLTP modernos:
👉 sim.
Principalmente:
- ERP
- APIs
- SaaS
- sistemas concorrentes
- workloads com muito blocking
Hoje muitos DBAs já consideram:
RCSI praticamente obrigatório.
Conclusão
O OPTIMIZED_LOCKING não é apenas uma feature nova.
Ele representa uma mudança arquitetural enorme no SQL Server.
Durante décadas o engine precisava escolher entre:
- consumo de memória
ou - concorrência.
Agora o SQL Server 2025 tenta entregar os dois:
- menos locks
- menos escalation
- menos blocking
- menos memória consumida
Tudo ao mesmo tempo.
E sinceramente?
Essa talvez seja uma das evoluções mais importantes do SQL Server moderno para ambientes OLTP de alta concorrência.
Quer se aprimorar como DBA ou DEV que trabalha com o SQL SERVER?
Segue Principais Formações:
- Coloque comentário que gostaria de ter acesso aos cursos com desconto.
- AcademiaDBA. Formação Completa para DBA.
Aprenda SQL Server, Oracle, PostgreSQL, MySQL, Data Warehouse, ETL com SSIS/SSAS e Power BI em uma plataforma prática e focada na carreira, criada para ajudar você a se tornar um profissional confiante em banco de dados e dados.
1316 aulas e 412 horas de conteúdo original
Legendas: Portugues
https://formacaodba.academiadba.com/
1.1 DBAcademy. Master Databases.Build a Real Data Career.
Learn SQL Server, Oracle, PostgreSQL, MySQL, Data Warehousing, ETL with SSIS/SSAS, and Power BI in one practical, career-focused platform designed to help you become a confident database and data professional.
1316 class e 412 hours
Subtitles: English, Spain, France
https://dbacademy.academiadba.com/
- Mastering SQL Server – 86 horas: torne-se um DBA SQL Server
Curso Completo de DBA SQL Server: Aprenda do Zero, na Prática, com Azure, Performance, Segurança e Alta Disponibilidade.
https://www.udemy.com/course/servino_sqlserver/
2.1 Dominando scripts PowerShell para o SQL Server
Do básico ao avançado: aprenda PowerShell passo a passo e transforme sua rotina de DBA com automações inteligentes.
https://www.udemy.com/course/dbapowershell/
2.2 Toolkit do DBA SQL Server
Monitoramento com DBADASH, Stress Test com SQLQUERYSTRESS, DBATools e Scripts Essenciais para o DBA SQL Server
https://www.udemy.com/course/toolkitdbasqlserver/
2.3 SQL Server DBA Toolkit
Monitoring with DBADASH, Stress Testing with SQLQUERYSTRESS, DBATools, and Essential Scripts for the SQL Server DBA. In English
https://www.udemy.com/course/sql-server-dba-toolkit/
2.4 Cluster-AG Always ON e Log Shipping no SQL SERVER 2025
Aprenda a configurar ambiente de disaster recovery no SQL Server usando o Cluster com AG Always on e Log Shipping
https://www.udemy.com/course/logshippingsqlserver/
- Curso Postgres Completo, 50 horas – Formação DBA
Aprenda Banco de Dados Postgres, Modelagem de Dados e programação usando SQL – do básico ao avançado
https://www.udemy.com/course/postgrescompleto/
3.1 Cluster Postgres: Domine Clusters Gerenciado pelo Patroni
Aprenda a montar um cluster PostgreSQL robusto no Linux utilizando Patroni, ETCD, HAProxy e Keepalived
https://www.udemy.com/course/clusterpostgres/
3.2 Postgres Cluster: Master Patroni-Managed Clusters
Learn how to build a robust PostgreSQL cluster on Linux using Patroni, ETCD, HAProxy and Keepalived. In English
https://www.udemy.com/course/postgres-cluster/
- Curso ORACLE Completo – 89 horas, formação DBA
Aprenda Banco de Dados Oracle, Modelagem de Dados e programação usando PL/SQL – do básico ao avançado
https://www.udemy.com/course/dbaoracle/ - Curso MySQL Completo – 123 horas, formação DBA
Aprenda MySQL, SQL, Azure MySQL, Modelagem de Dados, Windows Server e Linux Ubuntu Server – do básico ao avançado
https://www.udemy.com/course/mysqlcompleto/
5.1 MySQL Course – 75 Hours, Become a DBA
MySQL Course – 75 hours, DBA training. Learn MySQL / SQL Language – From Basic to Advanced. In English
https://www.udemy.com/course/mysqlcourse/
- Curso Analista de Dados, formação profissional – 52 horas
Aprenda SQL Server, modelagem de dados, Linguagem SQL, SSIS, SSAS, data Warehouse, Stage, Power BI
https://www.udemy.com/course/analistadados/ - Curso PowerBI – Formação Analista de BI – 28 horas
PowerBI, Linguagem SQL e Modelagem de Dados, do básico ao avançado. Se torne um Analista de BI – Business Intelligence
https://www.udemy.com/course/curso-powerbi-completo/ - Guia Completo para a Carreira de DBA
Como conquistar sua primeira vaga como DBA — mesmo começando do zero e evoluir até pleno ou criar seu próprio negócio
https://www.udemy.com/course/guiacarreiradba/ - Analista de Dados: Da Primeira Vaga ao Negócio Próprio
Aprenda a se posicionar, conseguir entrevistas, passar em processos seletivos, trabalhar bem nos primeiros 90 dias
https://www.udemy.com/course/guianalistadados/
Bons Estudos
Prof. Msc Sandro Servino
www.academiadba.com
Share this content:



Post Comment