Escolar Documentos
Profissional Documentos
Cultura Documentos
Dados
Capítulo 3 – Lock, Block, Deadlock e aspectos de transações em banco
de dados
1
Objetivos
Entendendo o mecanismo de Lock em um
banco de dados
2
bloqueio (Lock)
• O bloqueio (LOCK) é um mecanismo desenvolvido para evitar a ocorrência de
problemas de manipulação concorrente das informações. Funciona como um
bloqueio no acesso aos recursos dentro de um ambiente cliente/servidor.
• Por conta dos bloqueios, um mesmo dado não pode ser utilizado
simultaneamente pelos usuários. Assim, um usuário não poderá ler e alterar
dados que estão sendo processados por outro usuário, ou seja, não haverá
conflitos de atualização.
Por exemplo, quando uma transação realiza uma operação de escrita (como um
UPDATE), ela adquire um lock exclusivo na linha ou tabela afetada. Outras transações
que tentam acessar esses dados ao mesmo tempo terão que esperar até que o lock
seja liberado.
A concorrência otimista, por outro lado, não utiliza locks exclusivos para evitar
conflitos. Em vez disso, ela assume que os conflitos são raros e que a maioria das
3
transações pode ser executada simultaneamente sem causar problemas. Nesse
modelo, as transações não bloqueiam uns aos outros, mas podem detectar conflitos
de forma retroativa e tomar medidas apropriadas para resolvê-los.
3
DeadLock
• Deadlock é um mecanismo de banco de dados quando
ocorre um bloqueio realizado de forma cruzada, e deve
ocorrer entre duas sessões que estejam transacionando os
mesmos dados em dois comandos distintos e haja um
bloqueio mútuo cruzado.
• Para que possa ocorrer devemos ter duas sessões distintas
em que a primeira imponha um bloqueio em um conjunto
de registros (A), Já a sessão 2 deve impor bloqueio em um
conjunto de registros (B), novamente a primeira sessão
deve tentar impor um bloqueio a um conjunto de registros
transacionados pela sessão secundária(pode ser apenas 1
registro) e com isso a sessão inicial ficará bloqueada pela
sessão secundária. Por fim para completar a sessão
secundária caso tente manipular algum registro bloqueado
pela sessão inicial também ficará bloqueada (bloqueio
mútuo) também conhecido por Deadlock
• O mecanismo de banco de dados terá de atuar para liberar
a sessão que iniciou a transação para que a mesma possa
efetivar a transação inicial .
•
Cada transação está aguardando a liberação de um recurso que é mantido pela outra
transação, criando um ciclo de bloqueio.
4
3. Uso excessivo de bloqueios exclusivos: Se as transações adquirirem bloqueios
exclusivos por um longo período ou em muitos recursos, a probabilidade de ocorrer
um deadlock aumenta. Transações que retêm bloqueios exclusivos por muito tempo
podem criar uma situação em que outras transações ficam bloqueadas esperando a
liberação desses bloqueios.
•SQL Server:
No SQL Server, a detecção de deadlock é realizada automaticamente pelo mecanismo
de banco de dados. O SQL Server escolhe uma das transações envolvidas como a
vítima do deadlock e a finaliza, liberando os recursos bloqueados. É possível
monitorar e analisar os registros de eventos do SQL Server para identificar deadlocks
4
e ajustar o design de consultas, índices ou a configuração do isolamento das
transações para reduzir a probabilidade de ocorrência de deadlocks.
•Oracle:
No Oracle, a detecção de deadlock é feita por meio de um algoritmo que analisa as
relações de bloqueio entre as transações. Quando um deadlock é detectado, o Oracle
seleciona uma das transações como a vítima e a finaliza para resolver o deadlock. É
possível utilizar consultas, como o V$LOCK e o V$SESSION, para identificar e analisar
deadlocks. A otimização de consultas, o uso adequado de índices e o ajuste da
configuração de bloqueio podem ajudar a mitigar a ocorrência de deadlocks.
PostgreSQL:
No PostgreSQL, a detecção de deadlock é realizada automaticamente pelo
mecanismo de banco de dados. Quando um deadlock é detectado, uma das
transações é escolhida como a vítima e é automaticamente cancelada. O PostgreSQL
registra informações sobre os deadlocks no arquivo de log do servidor. Para
identificar deadlocks, é possível consultar as visualizações do sistema, como a
pg_stat_activity e a pg_locks. A otimização de consultas, a definição adequada de
índices e a configuração apropriada dos parâmetros de bloqueio podem ajudar a
evitar a ocorrência de deadlocks.
4
DeadLock – Efeitos
no banco de dados
• Deadlocks podem ter consequências graves na
performance do banco de dados, e antes de tudo
consomem muito processamento do mesmo para que
possam ser identificados e as respectivas sessões sejam
liberadas.
• As causas do deadlock podem ser consideradas de
infraestrutura, de configuração do banco de dados ou
ainda ligadas a falhas na programação do banco de dados,
esta é geralmente a causa mais comum entre todas
apresentadas.
• Deadlocks podem ocorrer esporadicamente e neste caso
não necessariamente representam um problema, a
quantidade , incidência e volume é que determinam o seu
grau de nocividade para a operação do banco de dados.
•
5
indisponibilidade temporária do banco de dados. Os deadlocks podem causar uma
interrupção significativa nos fluxos de trabalho e nas operações críticas do sistema,
resultando em uma redução da produtividade e na insatisfação dos usuários.
Causas do Deadlock:
3.Transações longas: Transações que retêm bloqueios por um longo período podem
aumentar a probabilidade de ocorrerem deadlocks. Isso pode acontecer quando uma
transação executa várias operações complexas ou quando um ponto de salvamento é
mantido por um período prolongado.
5
4.Uso excessivo de bloqueios exclusivos: Se as transações adquirirem bloqueios
exclusivos em muitos recursos ou por um tempo prolongado, a probabilidade de
ocorrer um deadlock aumenta. Transações que retêm bloqueios exclusivos por muito
tempo podem criar uma situação em que outras transações ficam bloqueadas
esperando a liberação desses bloqueios.
5
Concorrência otimista
1. Paralelismo: As transações podem ser executadas simultaneamente sem
bloquear umas às outras, permitindo um maior grau de paralelismo no
acesso aos dados.
2. Ausência de bloqueios: Não há bloqueios exclusivos adquiridos pelas
transações durante a leitura e gravação de dados.
3. Detecção retroativa de conflitos: Os conflitos são detectados
posteriormente, durante a validação das transações. Isso ocorre por meio
de mecanismos como marcas de tempo (timestamps) ou controle de
versão (versioning).
4. Menor contenção: Como não há bloqueios exclusivos, há menos
contenção entre transações concorrentes, o que pode melhorar o
desempenho em cenários com muitas transações simultâneas.
5. Possibilidade de reexecução de transações: Se um conflito for detectado,
a transação pode ser reexecutada ou as alterações podem ser
descartadas e revertidas.
6
descarte de suas alterações.
6
Concorrência Pessimista
1. Exclusividade de acesso: As transações adquirem bloqueios exclusivos
para garantir a exclusividade do acesso aos objetos de dados.
2. Contenção e bloqueios: Os bloqueios são adquiridos para evitar conflitos
entre transações concorrentes. Isso pode resultar em contenção, onde as
transações precisam esperar pela liberação dos bloqueios para acessar
ou modificar os dados.
3. Garantia de consistência: A concorrência pessimista garante a
consistência e a integridade dos dados, pois impede que múltiplas
transações modifiquem o mesmo objeto simultaneamente.
4. Maior segurança: Através dos bloqueios exclusivos, a concorrência
pessimista evita a ocorrência de situações de leitura suja (dirty reads),
leitura não repetível (non-repeatable reads) e escrita fantasma (phantom
writes).
5. Menor risco de conflitos: Ao garantir a exclusividade do acesso, a
concorrência pessimista reduz a probabilidade de ocorrerem conflitos
entre transações concorrentes.
7
reads) e escrita fantasma (phantom writes). Isso garante que as transações vejam
dados consistentes e evita resultados indesejáveis.
7
Tipo de bloqueio Descrição
bloqueio Exclusivo
Atualização
Exclusive Lock
Update Lock
Permite acesso exclusivo para leitura e escrita,
bloqueando outros acessos.
ANSI Leitura
Shared Read
Lock
Permite leitura simultânea, mas impede escrita
concorrente.
O padrão ANSI SQL define diferentes tipos de bloqueio (lock) que podem ser
utilizados em sistemas de banco de dados. Esses tipos de bloqueio são usados para
controlar o acesso concorrente aos dados e garantir a consistência e a integridade
das transações. Abaixo estão alguns dos principais tipos de bloqueio definidos pelo
padrão ANSI SQL:
8
Descrição: Também conhecido como "bloqueio de escrita", permite que uma única
transação acesse um recurso exclusivamente para leitura e escrita, bloqueando o
acesso de outras transações ao recurso enquanto o bloqueio estiver ativo.
Esses são alguns dos tipos de bloqueio definidos pelo padrão ANSI SQL. É importante
observar que a implementação exata dos tipos de bloqueio pode variar entre os
diferentes sistemas de gerenciamento de banco de dados, mas os conceitos gerais
permanecem
8
Nível de Tipo de
Granularidade bloqueio Descrição
bloqueio de Bloqueia uma chave específica em um índice, permitindo que outras
Chave (Key)
Leitura transações leiam outras chaves simultaneamente.
RID (Identificador de bloqueio de Bloqueia uma linha específica em uma página de dados, permitindo que
Granularidade Linha)
Extent
Linha
bloqueio de
Extensão
outras transações acessem outras linhas simultaneamente.
SQL Server
bloqueio de Bloqueia uma tabela inteira, permitindo que outras transações leiam
Tabela (Table)
Leitura simultaneamente.
bloqueio de Bloqueia todo o arquivo de banco de dados, permitindo que apenas uma
Arquivo (File)
Leitura transação acesse o arquivo por vez.
bloqueio de Bloqueia recursos específicos de um aplicativo, permitindo que apenas
Aplicativo (Application)
Leitura uma transação acesse esses recursos por vez.
Unidade de Alocação bloqueio de Bloqueia uma unidade de alocação específica, que é uma estrutura de
(Allocation Unit) Leitura armazenamento lógica usada pelo SQL Server.
Banco de Dados bloqueio de Bloqueia todo o banco de dados, permitindo que apenas uma transação
(Database) Leitura acesse o banco de dados por vez.
Chave (Key):
Página (Page):
9
página de dados. Permite que outras transações acessem outras linhas
simultaneamente.
Exemplo: Se uma transação está modificando a linha com o RID "123" dentro de uma
página, outras transações podem ler ou modificar as linhas com os RIDs "456", "789"
e assim por diante.
Extent:
Tabela (Table):
Arquivo (File):
Aplicativo (Application):
9
Exemplo: Se uma transação está acessando recursos específicos de um aplicativo,
como um arquivo de configuração, outras transações não podem acessar esses
recursos simultaneamente.
Metadados (Metadata):
9
Tipo de bloqueio Descrição
Permite que várias transações leiam simultaneamente um objeto
bloqueio de Leitura
específico, mas impede que outras transações façam alterações.
Permite que apenas uma transação tenha acesso exclusivo a um objeto,
bloqueio de Escrita
impedindo que outras transações leiam ou escrevam.
É uma forma especial de bloqueio de leitura que é convertido em um
bloqueio de Atualização
bloqueio de Extensão
transações acessem ou modifiquem essa página.
Bloqueia um intervalo contíguo de páginas de dados no banco de dados,
permitindo que apenas uma transação acesse essas páginas.
bloqueio de Arquivo
Bloqueia um esquema inteiro de objetos, como uma tabela ou exibição,
impedindo que outras transações modifiquem a estrutura.
Bloqueia todo o arquivo de banco de dados, permitindo que apenas uma
transação acesse o arquivo por vez.
Bloqueia recursos específicos de um aplicativo, impedindo que outras
bloqueio de Aplicativo
transações acessem esses recursos simultaneamente.
Bloqueia os metadados do banco de dados, impedindo que outras
bloqueio de Metadados
transações modifiquem as informações sobre a estrutura dos objetos.
bloqueio de Unidade de Bloqueia uma unidade de alocação específica, que é uma estrutura de
Alocação armazenamento lógica usada pelo SQL Server.
Bloqueia todo o banco de dados, permitindo que apenas uma transação
bloqueio de Banco de Dados
acesse o banco de dados por vez.
Duas transações podem ter um shared lock em um mesmo recurso, mesmo que uma
das transações ainda não tenha sido finalizada. Enquanto todas as linhas que irão
satisfazer a query não forem enviadas para o cliente, os shared locks serão mantidos.
Lembramos que o shared lock de um registro será liberado assim que o próximo
registro for lido.
10
Nivel de Granularidade Descrição
de bloqueios
bloqueio de Extensão Bloqueia uma extensão, que é um conjunto contíguo de blocos,
Oracle (Extent) no Oracle. Garante a exclusividade de acesso à extensão.
Exemplo: Suponha que duas transações (T1 e T2) estejam lendo e modificando a
mesma linha em uma tabela de clientes. Se a transação T1 adquirir um bloqueio de
linha em uma linha específica enquanto está atualizando os dados, a transação T2
não poderá modificar essa mesma linha até que T1 libere o bloqueio.
11
ler nem modificar os dados dessa tabela até que o bloqueio seja liberado.
bloqueio de Segmento(Segment):
11
Exemplo: Se uma transação T1 estiver realizando uma operação crítica em um banco
de dados específico, ela pode adquirir um bloqueio de banco de dados, garantindo
que nenhuma outra transação (por exemplo, T2) possa acessar ou modificar qualquer
dado nesse banco de dados até que T1 libere o bloqueio.
11
Nível de Tipo de
Granularidade bloqueio Descrição
Bloqueio de Linha
(Row) Registro Aplicado a um registro específico em uma tabela.
Bloqueio de
Granularidade Página(Page)
Página Aplicado a uma página física no armazenamento do banco de dados.
Bloqueio de objeto
Objeto Aplicado a objetos específicos no banco de dados, como funções,
(object)
visões e sequências.
12
Descrição: O bloqueio de página é aplicado a uma página física no
armazenamento do banco de dados, que contém vários registros.
12
Além desses bloqueios, também existem bloqueios de objeto, como bloqueios de
função, bloqueios de visão e bloqueios de sequência
12
Contenção de banco de dados
• Contenção é uma ação que ocorre em banco de dados que
provoca um evento denominado espera (Wait), neste caso um
processo que esteja ocasionando contenção do banco de dados
durante a sua execução , irá provocar à espera (wait) de um ou
mais outros processos.
• Contenções podem ocorrer de forma ocasional e muitas vezes não
poderá ser evitada, mas Podemos identifica-la e quando a sua
origem for algo que Podemos controlar ou ajustar , devemos faze-
lo sob pena de provocação de lentidão para um ou todas as
demais sessões de banco de dados em andamento.
• Contenções podem ocorrer o problema é a intensidade das
esperas que possa provocar e o tempo de duração das mesmas.
• Contenções são a causa de problemas e as esperas são os efeitos,
por isso todo processo de tuning visando a eliminação de gargalos
de performance passa pela identificação das contenções
13
Categorias de
contenção de banco
de dados
De forma geral as contenções de banco de dados devem ser tratadas de forma mais
genérica para a mais específica, especialmente quando os problemas de performance
ocorram de maneira constante e não haja processos regulares de análise de
performance.
14
2. Contenção de E/S (entrada e saída) (I/O Contention): A contenção de E/S ocorre
quando várias operações de leitura e gravação competem por recursos de E/S, como
discos rígidos ou unidades de estado sólido (SSDs). Isso pode acontecer quando há
um número excessivo de transações simultâneas que requerem acesso a dados
armazenados em dispositivos de armazenamento. A contenção de E/S pode levar a
atrasos nas operações de leitura e gravação, resultando em uma diminuição no
desempenho do banco de dados. Para lidar com a contenção de E/S, é possível
adotar técnicas como o uso de armazenamento em cache, otimização de consultas,
particionamento de tabelas ou distribuição de dados em diferentes dispositivos de
armazenamento.
14
Tipos de contenção
de banco de dados
As contenções pode advir de diversas circunstâncias , inclusive de causas
múltiplas , porem normalmente de uma causa maior.
A seguir listaremos os principais tipos de contenção de banco de dados:
• Contenção de bloqueio (Lock Contention)
• Contenção de Página/Bloco (Page/Block Contention)
• Contenção de Tabela (Table Contention)
• Contenção de Índice (Index Contention)
• Contenção por Checkpoint (Checkpoint Contention)
• Contenção por Gravação de Log (Log Writing Contention)
• Contenção por Gravação de Datafile (Datafile Writing Contention)
• Contenção por Arquivamento (Archiving Contention)
• Contenção de Tablespace/Filegroup
• Contenção de Datafile
• Contenção de Memória/Instancia
• Contenção de Processos Background
• Contenção de Processos Server ou Worker
15
3. Contenção de tabela (Table Contention): Esse tipo de contenção ocorre quando
várias transações estão tentando acessar a mesma tabela de banco de dados ao
mesmo tempo. Pode acontecer quando há uma alta concorrência para acessar uma
tabela específica, o que pode levar a bloqueios e atrasos.
15
de um tablespace específico. Pode ocorrer quando há um aumento significativo na
atividade de gravação ou quando uma tabela ou índice específico está sendo
acessado por muitas transações simultaneamente. A contenção de tablespace pode
levar a bloqueios, atrasos na execução de consultas e diminuição do desempenho do
banco de dados.
15
Contenção de
bloqueio (Lock
contention)
16
aumentar a probabilidade de contenção por bloqueio.
3.Falhas nas transações: Em casos extremos, a contenção por bloqueio pode resultar
em falhas nas transações. Se uma transação atingir o limite de tempo máximo de
espera para adquirir um bloqueio, pode ser forçada a ser encerrada, resultando em
uma transação não confirmada e possível perda de dados.
16
Contenção por página /Bloco (Page/Block)
contention
• A contenção por página (SQL Server e PostgreSQL) ou de bloco
(Oracle) podem ocorrer por excesso de transações concorrentes
em uma mesma página ou Bloco, especialmente comandos
Update, embora também possam ocorrer com insert e delete
também. Outra causa de contenção por página pode ser a questão
de imposição de bloqueios (automáticos ou manuais) as páginas,
no que se refere a blocos (Oracle) não é possível isso, pois não
possui este tipo de granularidade para bloqueios
• Possíveis causas:
• Acesso concorrente a página/Bloco
• Tipo de bloqueio incompatível (SQL Server e PostgreSQL)
• Fragmentação em disco (Discos SAS rígidos)
• Ineficiência das consultas
17
páginas ou blocos, resultando em contenção.
Para SQL Server a contenção de página pode ser resolvida entendendo o volume
transacional por página e o tempo de bloqueio da página. Veremos nos próximos
capítulos como identificar este tipo de contenção em SQL Server.
17
Contenção de Tabela - (Table contention)
• A contenção de índice pode ser uma causa de problemas de performance, pois ações de
inserção, atualização e exclusão podem ser diretamente afetadas em função deste tipo
de contenção, em casos mais severos até mesmo consultas podem ser afetadas.
• Este tipo de contenção pode ser provocado por armazenamento de dados ineficiente
(discos mais lentos) ou por questões de excesso de demanda e bloqueios sobre o índice,
somado a um hardware potencialmente ineficiente, ou mediante um excesso de carga de
trabalho simultâneo.
• Possíveis causas:
• Tipo de bloqueio incompatível
• Atualizações Concorrentes
• Inserções Concorrentes
• Deleções concorrentes
18
inserir registros nas mesmas páginas de dados.
18
Contenção de Índice - (Index contention)
• A contenção de tabela pode ser uma causa de problemas de performance, pois ações de
inserção, atualização e exclusão podem ser diretamente afetadas em função deste tipo
de contenção, em casos mais severos até mesmo consultas podem ser afetadas.
• Este tipo de contenção pode ser provocado por armazenamento de dados ineficiente
(discos mais lentos) ou por questões de excesso de demanda e bloqueios sobre a tabela,
somado a um hardware potencialmente ineficiente, ou mediante um excesso de carga de
trabalho simultâneo.
• Possíveis causas:
• Tipo de bloqueio incompatível
• Atualizações Concorrentes
• Inserções Concorrentes
• Deleções concorrentes
Peço desculpas pelo equívoco anterior. Agora, vou explicar sobre a contenção de
índice (Index Contention) em detalhes:
19
mesma página de índice para realizar a operação. Isso pode resultar em bloqueios e
atrasos devido à competição pelo acesso ao mesmo recurso.
19
Contenção de checkpoint - (checkpoint
contention)
• A contenção de checkpoint pode indicar problemas graves em um banco de
dados, especialmente se a incidências destes problemas forem frequentes. A
contenção por checkpoint impede que as páginas de memória possam fluir dos
buffers e caches de memória para o meio físico. Checkpoints são um importante
instrumento também para a recuperação do banco de dados , pois depois de
ocorrerem criam um sincronismo entre memória e disco , mesmo que por
período de tempo muito curto. Em caso de falha as transações depositadas.
• Possíveis causas:
• Buffer cache mal dimensionado ou
inadequado
• Atividade intensa de
movimentação de banco de dados
• Configuração do tempo de
checkpoint quando possível
20
3. Configuração do intervalo de checkpoint: O intervalo de tempo entre os
checkpoints também pode influenciar a contenção. Se o intervalo for muito curto,
haverá checkpoints frequentes, aumentando a chance de contenção. Por outro lado,
se o intervalo for muito longo, pode ocorrer uma grande quantidade de páginas de
dados modificadas na memória, resultando em checkpoints mais demorados e
possivelmente causando bloqueios.
SQL Server: No SQL Server, o tempo de execução do checkpoint pode ser configurado
20
por meio das opções de recuperação do banco de dados. Os principais recursos
relacionados são:
recovery interval: Define o intervalo de tempo, em minutos, entre os
checkpoints. Aumentar esse valor pode resultar em checkpoints menos
frequentes.
target_recovery_time: Esse recurso permite definir o tempo médio de
recuperação do banco de dados após uma falha. Aumentar esse valor pode
levar a menos checkpoints frequentes.
Para lidar com a contenção de checkpoint, podem ser adotadas várias estratégias,
como ajustar a configuração do intervalo de checkpoint, dimensionar
20
adequadamente o buffer cache, otimizar a carga de trabalho do banco de dados para
reduzir a atividade de gravação excessiva e monitorar o desempenho do sistema para
identificar e resolver problemas de contenção.
20
Contenção de Log (Log
writing contention)
A contenção por gravação de log (log writing contention) ocorre quando várias
transações estão competindo pelo acesso e gravação do log de transações em um
banco de dados. O log de transações é uma parte fundamental do sistema de
gerenciamento de banco de dados, responsável por registrar todas as operações
realizadas no banco de dados. Vamos explorar as causas e os impactos da contenção
por gravação de log:
21
3.Recuperação após falhas: Durante a recuperação do banco de dados após uma
falha, as transações precisam garantir que suas alterações sejam registradas no log de
transações. Se várias transações estiverem sendo recuperadas simultaneamente, isso
pode resultar em contenção na gravação de log.
3.Risco de perda de dados: Se a contenção por gravação de log for severa, pode
ocorrer um atraso significativo na gravação das operações de transação no log. Isso
pode aumentar o risco de perda de dados em caso de falhas no sistema ou
interrupções inesperadas.
SQL Server:
21
Ajuste do tamanho do arquivo de log: Verifique o tamanho do arquivo de log e
dimensione-o adequadamente para lidar com a carga de trabalho. Monitorar o
crescimento do log e ajustar o tamanho conforme necessário pode ajudar a evitar
contenção.
Oracle:
Configuração de grupos de redo log: Aumente o número de grupos de redo log para
distribuir a atividade de gravação. Isso ajuda a reduzir a contenção, permitindo que
várias sessões gravem em grupos de redo log diferentes simultaneamente.
PostgreSQL:
21
Configuração de parâmetros de checkpoint: Ajuste os parâmetros de checkpoint
relacionados, como checkpoint_completion_target e checkpoint_segments, para
otimizar o processo de gravação do log. Isso pode ajudar a reduzir a contenção e
melhorar o desempenho.
Lembre-se de que cada banco de dados tem suas próprias características e opções de
configuração específicas. É importante consultar a documentação oficial do banco de
dados e realizar testes de desempenho para encontrar a melhor abordagem para
resolver problemas de contenção de log em seu ambiente específico.
21
Contenção de gravação de
Datafile (Datafile Writing
Contention)
A contenção por gravação de datafile (log writing datafile) ocorre quando várias
transações estão competindo pelo acesso e gravação nos arquivos de dados
(datafiles) de um banco de dados. Essa contenção pode ocorrer durante o processo
de gravação de alterações permanentes nos arquivos de dados, afetando o
desempenho do sistema. Vamos explorar as causas e os impactos da contenção por
gravação de datafile:
22
3.Fragmentação de disco: Se os arquivos de dados estiverem fragmentados
fisicamente no disco, isso pode levar a tempos de acesso prolongados e maior
competição durante o processo de gravação. A fragmentação de disco pode resultar
em contenção e impactar o desempenho da gravação de datafile.
Para resolver a contenção por gravação de datafile, podem ser adotadas algumas
estratégias, como:
•Aumentar o tamanho do cache do buffer para lidar com a carga de trabalho e reduzir
a competição por acesso aos arquivos de dados.
22
Para resolver problemas de contenção de datafile no SQL Server, Oracle e PostgreSQL,
é importante considerar as melhores práticas e técnicas específicas de cada banco de
dados. Abaixo estão algumas abordagens gerais para resolver problemas de
contenção de datafile em cada um deles:
SQL Server:
Oracle:
PostgreSQL:
22
diferentes tablespaces e arquivos de dados em diferentes discos físicos. Isso ajuda a
distribuir a atividade de gravação e reduzir a contenção.
Lembre-se de que cada banco de dados tem suas próprias características e opções de
configuração específicas. É importante consultar a documentação oficial do banco de
dados e realizar testes de desempenho para encontrar a melhor abordagem para
resolver problemas de contenção de datafile em seu ambiente específico.
22
Contenção por Arquivamento
(Archiving Contention)
23
2. Configuração inadequada do arquivamento: Uma configuração inadequada do
processo de arquivamento, como um intervalo de arquivamento muito curto ou uma
localização de arquivo de arquivamento lenta, pode levar a contenção. Isso ocorre
porque o sistema precisa lidar com um grande número de transações simultâneas
tentando arquivar os registros de log.
23
•Monitorar o desempenho do sistema e ajustar os recursos de E/S, como velocidade
de disco e configurações de armazenamento, para garantir que possam lidar
adequadamente com a taxa de geração de registros de log.
SQL Server:
No SQL Server, a prática comum é realizar backups regulares dos bancos de dados,
incluindo os logs de transações, para garantir a recuperação e a preservação dos
dados. Os backups podem ser configurados para reter os logs antigos e, assim,
fornecer um histórico de alterações. No entanto, o SQL Server não tem um processo
de arquivamento específico como os outros bancos de dados mencionados.
Oracle:
23
1.Avaliação e ajuste da configuração do processo de arquivamento: Avalie a
configuração do processo de arquivamento no Oracle, incluindo o intervalo de
arquivamento, os modos de arquivamento e os parâmetros relacionados. Ajuste
essas configurações para melhorar o desempenho e reduzir a contenção.
PostgreSQL:
23
Contenção por Filegroup /
Tablespace
(Filegroup/Tablespace
Contention)
24
alocado para os objetos no tablespace/filegroup está fragmentado, com espaços
vazios entre os objetos. Isso pode levar a uma utilização ineficiente do espaço e
resultar em contenção.
SQL Server:
24
3.Reorganização e compactação de objetos: Realize a reorganização e a compactação
de objetos nos filegroups para reduzir a fragmentação de espaço e melhorar a
utilização do espaço de armazenamento. Isso pode ajudar a evitar a contenção
causada pela alocação ineficiente de espaço.
Oracle:
PostgreSQL:
24
Contenção de memória
(Memory Contention)
25
3.Má gestão de cache: O cache é uma área de memória utilizada para armazenar
dados frequentemente acessados, como blocos de dados ou planos de execução de
consultas. Se o tamanho do cache não for adequado para a carga de trabalho do
banco de dados, pode ocorrer uma contenção de memória, pois as transações
competem pelo acesso ao cache.
4.A falta de índices em bancos de dados Oracle, SQL Server e PostgreSQL pode levar a
um mal gerenciamento de memória devido aos seguintes motivos:
25
1.Diminuição do desempenho do banco de dados: A contenção de memória pode
levar a atrasos na execução de consultas e operações, resultando em um
desempenho geral mais lento do banco de dados. As transações podem precisar
esperar pela disponibilidade de recursos de memória, causando atrasos no
processamento.
SQL Server:
25
1. Ajuste da configuração de alocação de memória: No SQL Server, é possível
configurar os limites de alocação de memória para diferentes componentes, como o
cache do buffer, cache de procedimentos e cache de consultas. Ajuste essas
configurações de acordo com a carga de trabalho e os recursos disponíveis para evitar
a contenção de memória.
Oracle:
PostgreSQL:
25
otimizações de consultas, crie índices apropriados e revise os planos de execução
para reduzir a demanda por memória. Além disso, utilize técnicas como
particionamento de tabelas e agrupamento de dados para melhorar a eficiência da
memória.
25
Contenção de processos de
Segundo plano (Process
background Contention)
26
3. Configuração inadequada: Uma configuração inadequada dos parâmetros
relacionados aos processos background pode levar à contenção. Por exemplo, se o
número de threads ou conexões para processos background não for suficiente para
lidar com a carga de trabalho, ocorrerá contenção.
26
•Considerar a escalabilidade vertical (dimensionamento) do sistema, adicionando
mais recursos para atender às demandas de processamento dos processos
background.
26
Contenção de processo
LGWR Oracle
A contenção de LGWR (Log Writer) ocorre quando várias transações competem pelo
acesso e uso do processo LGWR, responsável por gravar os registros de log em disco.
Isso pode levar a atrasos na gravação do log e afetar o desempenho geral do banco
de dados.
1.Alta taxa de gravação de log: Se o banco de dados estiver gerando um alto volume
de registros de log devido a transações intensivas, isso pode sobrecarregar o LGWR e
causar contenção.
27
trabalho do banco de dados.
1.LOG_BUFFER: Este parâmetro define o tamanho do buffer de log, que é usado para
armazenar temporariamente os registros de log antes que sejam gravados em disco.
Aumentar o valor desse parâmetro pode ajudar a reduzir a contenção, fornecendo
mais espaço para armazenar os registros de log.
27
4. Monitore o desempenho e os indicadores do LGWR: Utilize ferramentas de
monitoramento para acompanhar o desempenho do LGWR, como a taxa de gravação
de log, o tempo de resposta e a atividade de I/O. Identifique quaisquer gargalos ou
problemas que possam estar afetando o desempenho do LGWR.
6.Teste e avalie os resultados: Realize testes para avaliar o impacto das mudanças
realizadas. Monitore novamente o desempenho e verifique se a contenção de LGWR
foi reduzida. Ajuste as configurações ou procedimentos, se necessário, até obter um
desempenho satisfatório.
27
Contenção de processo
DBWR Oracle
2.Buffer Cache insuficiente: O Buffer Cache é uma área de memória usada para
armazenar blocos de dados em memória antes de serem gravados em disco. Se o
tamanho do Buffer Cache não for suficiente para a carga de trabalho do banco de
dados, isso pode levar à contenção de DBWR.
28
Parâmetros de configuração que podem ser ajustados para melhorar a contenção de
DBWR:
28
monitoramento para acompanhar o desempenho do DBWR, como a taxa de
gravação, o tempo de resposta e a atividade de I/O. Identifique quaisquer gargalos ou
problemas que possam estar afetando o desempenho do DBWR.
6.Teste e avalie os resultados: Realize testes para avaliar o impacto das mudanças
realizadas. Monitore novamente o desempenho e verifique se a contenção de DBWR
foi reduzida. Ajuste as configurações ou procedimentos, se necessário, até obter um
desempenho satisfatório.
Lembrando que cada banco de dados tem suas próprias características e parâmetros
de configuração específicos. Consulte a documentação oficial do seu banco de dados
e utilize as
ferramentas de monitoramento e ajuste adequadas para solucionar problemas de
contenção por DBWR de maneira eficaz.
28
Contenção de processo
CKPT Oracle
2.Tamanho inadequado do log buffer: O log buffer é uma área de memória usada
para armazenar os registros de log antes de serem gravados em disco durante um
checkpoint. Se o tamanho do log buffer for muito pequeno para a carga de trabalho
do banco de dados, isso pode levar à contenção de CKPT.
29
contenção.
29
4.Monitore o desempenho e os indicadores do CKPT: Utilize ferramentas de
monitoramento para acompanhar o desempenho do CKPT, como a atividade de
gravação, o tempo de resposta e a atividade de I/O. Identifique quaisquer gargalos ou
problemas que possam estar afetando o desempenho do CKPT.
6.Teste e avalie os resultados: Realize testes para avaliar o impacto das mudanças
realizadas. Monitore novamente o desempenho e verifique se a contenção de CKPT
foi reduzida. Ajuste as configurações ou procedimentos, se necessário, até obter um
desempenho satisfatório.
Lembrando que cada banco de dados tem suas próprias características e parâmetros
de configuração específicos. Consulte a documentação oficial do seu banco de dados
e utilize as ferramentas de monitoramento e ajuste adequadas para solucionar
problemas de contenção por CKPT de maneira eficaz.
29
Contenção de processos
Worker SQL Server
30
insuficiente para lidar com a carga de trabalho, ocorrerá contenção.
30
armazenamento.
30
Contenção de processos
Background PostgreSQL
• Autovacuum
• Background Writer (BGW)
• Checkpointer
• Walwriter
31
causando atrasos e pressão adicional sobre o Checkpointer.
31
3. Problemas de concorrência: A contenção no Autovacuum pode levar a bloqueios
prolongados e conflitos de concorrência. Se várias transações estão aguardando a
execução do Autovacuum em uma tabela específica, isso pode levar a atrasos na
execução de outras transações que precisam acessar essa tabela.
31
Espera Contenção
Contenção x Espera
Contenção: A contenção ocorre quando duas ou mais Espera: A espera, por sua vez, refere-se ao estado em que
transações estão competindo por um recurso uma transação se encontra quando ela precisa aguardar a
compartilhado, como uma tabela, uma página de dados disponibilidade de um recurso que está sendo usado por
ou um bloqueio. Quando uma transação precisa acessar outra transação. Quando uma transação não consegue
um recurso que está sendo usado por outra transação, obter acesso imediato a um recurso necessário, ela entra
ela precisa aguardar até que o recurso esteja disponível. em um estado de espera até que o recurso seja liberado
Isso pode levar a atrasos no processamento das pela transação que está utilizando. Durante esse período, a
transações e afetar o desempenho geral do sistema. A transação permanece inativa e não pode prosseguir com
contenção pode ocorrer devido a uma variedade de sua execução. As esperas podem ser causadas por
fatores, como concorrência de acesso a dados, bloqueios contenção, bloqueios ou outros eventos que exigem que
conflitantes ou configuração inadequada do banco de uma transação aguarde a disponibilidade de um recurso.
dados.
São faces da mesma moeda, ou seja estão interligados, quando temos contenção
(Cara) possivelmente teremos espera e toda a espera advém de uma contenção.
NOTA:
32
Quando uma transação entra em espera, ela está aguardando a disponibilidade de
um recurso necessário. Da mesma forma, os sintomas da gripe, como febre, dores no
corpo, tosse e congestionamento nasal, são sinais de que o corpo está aguardando a
recuperação e a disponibilidade de recursos para combater o vírus.
É importante ressaltar que essa analogia é meramente ilustrativa e não deve ser
interpretada como uma descrição científica precisa de uma patologia clínica
específica. No entanto, pode ajudar a compreender as semelhanças conceituais entre
contenção e espera em um banco de dados e uma patologia clínica e seus sintomas.
32
Bloqueios de sessões de
banco de dados
Bloqueios de tabelas, registros, paginas podem ser deveram ser atendidos na sua respectiva ordem de
criados em transações e são adquiridos por uma chegada segundo o algoritimo FIFO (First IN – First Out),
determinada sessão de banco de dados, isso poderá isso implicará no encadeamento destes bloqueios
levar a que outras sessões possam ter que aguardar os provocando em muitos casos problemas graves de
recursos demandados pela sessão que originalmente performance. Analisar a causa nestes casos é fundamental ,
solicitou os bloqueios, e isso irá provocar um bloqueio já que o bloqueio é apenas um efeito , conforme
da sessão secundária , que colocará sua solicitação de mostramos no tópico anterior de contenção e espera.
bloqueio em uma fila de solicitações e aguardará o
tempo para que possa ser atendida, esse tempo irá
provocar uma espera, caso outras sessões venham após
a sessão secundária solicitar pelo recurso preso pela
sessão originária teremos uma cascata de bloqueios que
33
sessão tenta adquirir um bloqueio de escrita (exclusive lock) na mesma tabela, haverá
uma contenção até que o bloqueio de leitura seja liberado.
Para identificar e resolver problemas de bloqueio de forma prática, você pode seguir
as seguintes abordagens:
33
1. Monitoramento e análise:
2.Otimização de consultas:
3.Níveis de isolamento:
•Utilize níveis de isolamento mais restritos apenas quando necessário, para evitar
bloqueios excessivos e melhorar a concorrência.
33
de espera para permitir maior concorrência.
33
Bloqueios em SQL Server
Identificando esperas
provocadas por bloqueios
Bloqueios em PostgreSQL
SELECT
blocked.session_id AS SessionID,
blocked.wait_duration_ms AS WaitDuration,
blocked.blocking_session_id AS BlockingSessionID,
blocked.resource_type AS ResourceType,
blocked.resource_description AS ResourceDescription,
blocking.last_wait_type AS BlockingWaitType,
blocking.command AS BlockingCommand
FROM
sys.dm_os_waiting_tasks AS blocked
34
INNER JOIN sys.dm_exec_requests AS blocking
ON blocked.blocking_session_id = blocking.session_id
WHERE
blocked.wait_type LIKE 'LCK%'
SELECT
session_id, lock_type, mode_held, mode_requested,
lock_id1, lock_id2
FROM
v$lock
WHERE
request > 0
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM
pg_catalog.pg_locks AS blocked_locks
JOIN pg_catalog.pg_stat_activity AS blocked_activity ON blocked_activity.pid =
blocked_locks.pid
JOIN pg_catalog.pg_locks AS blocking_locks ON blocking_locks.locktype =
blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM
blocked_locks.transactionid
34
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity AS blocking_activity ON blocking_activity.pid =
blocking_locks.pid
WHERE
NOT blocked_locks.GRANTED
34
SQL Server
Transações em banco de
dados
BEGIN TRANSACTION;
COMMIT;
Oracle: No Oracle, as transações são controladas explicitamente pelo uso dos
35
comandos COMMIT e ROLLBACK. O COMMIT confirma as alterações feitas pela
transação, enquanto o ROLLBACK desfaz todas as alterações e retorna o banco de
dados ao estado anterior.
BEGIN
SAVEPOINT start_transaction;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO start_transaction;
RAISE;
END;
BEGIN;
COMMIT;
35
alteração é aplicada ao banco de dados.
3.Isolamento: As transações são isoladas umas das outras, o que significa que cada
transação é executada como se fosse a única transação em execução no banco de
dados. Isso evita que transações concorrentes interfiram umas nas outras e garante a
integridade dos dados.
SQL Server:
Oracle:
35
transação e torná-las permanentes. Um commit explícito também encerra a
transação atual.
PostgreSQL:
35
SQL Server
COMMIT
SQL Server:
Oracle:
36
dentro da transação, tornando-as permanentes no banco de dados.
PostgreSQL:
SQL Server:
COMMIT: É o comando padrão para realizar um commit explícito no SQL Server. Ele
confirma todas as alterações feitas dentro da transação e as torna permanentes no
banco de dados.
36
BEGIN TRANSACTION;
COMMIT;
Oracle:
COMMIT: Assim como no SQL Server, o comando COMMIT é utilizado para realizar
um commit explícito no Oracle. Ele confirma todas as alterações feitas dentro da
transação e as torna permanentes.
BEGIN
SAVEPOINT start_transaction;
COMMIT FORCE: Esse comando é usado para forçar a gravação imediata de todas as
alterações confirmadas no disco, mesmo que o banco de dados esteja configurado
com a gravação assíncrona ativada. Ele garante que todas as alterações confirmadas
sejam gravadas permanentemente antes de retornar.
Exemplo de uso no Oracle:
BEGIN
36
SAVEPOINT start_transaction;
COMMIT FORCE;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO start_transaction;
RAISE;
END;
BEGIN
SAVEPOINT start_transaction;
PostgreSQL:
36
desastres.
BEGIN;
COMMIT;
BEGIN;
-- Executar operações de inserção/atualização/exclusão
PREPARE TRANSACTION ‘Minha_transacao’;
36
SQL Server
ROLLBACK
O comando ROLLBACK é usado nos bancos de dados SQL Server, Oracle e PostgreSQL
para desfazer ou cancelar uma transação, revertendo todas as alterações feitas até o
ponto atual da transação. Cada banco de dados possui diferentes tipos de rollback
disponíveis:
SQL Server:
Oracle:
37
2.ROLLBACK TO SAVEPOINT: Esse comando é usado para desfazer as alterações feitas
após um savepoint específico. O savepoint é definido usando o comando SAVEPOINT
e pode ser usado para desfazer parte de uma transação, em vez de desfazer todas as
alterações.
PostgreSQL:
37
SQL Server
SAVEPOINT
SQL Server:
BEGIN TRANSACTION;
38
ROLLBACK TRANSACTION Savepoint1;
-- Confirmar as alterações
COMMIT;
Oracle:
BEGIN
SAVEPOINT Savepoint1;
SAVEPOINT Savepoint2;
-- Confirmar as alterações
COMMIT;
END;
PostgreSQL:
BEGIN;
SAVEPOINT Savepoint1;
SAVEPOINT Savepoint2;
38
-- Executar mais operações
-- Confirmar as alterações
COMMIT;
38
MODOS DE ISOLAMENTO Modo de Isolamento
READ UNCOMMITTED Possível
Dirty Read Fuzzy Read
Possível Possível
Phantom
- READ UNCOMMITED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
1.READ UNCOMMITTED: Este é o nível de isolamento mais baixo. Ele permite que
uma transação leia dados não confirmados por outras transações, resultando em
leituras sujas (dirty reads). Isso significa que as alterações feitas por outras transações
ainda não confirmadas podem ser lidas, o que pode levar a resultados inconsistentes.
39
inseridas ou removidas por outras transações durante a execução da transação atual.
39
continuará a ver o status de pagamento original, mesmo que a segunda transação o
atualize. Isso garante leituras repetíveis, pois a primeira transação vê os mesmos
dados consistentes ao longo da transação.
Para Oracle , SQL Server e PostgreSQL o modo default é o de READ COMMITED, que
implica que o banco de dados em uma consulta a dados retornará sempre os dados
que foram salvos, mesmo que estejam sendo alterados, no caso do SQL Server se isso
ocorrer a consulta será bloqueada enquanto a transação que a atualiza ou exlclui não
realizar um comando COMMIT ou ROLLBACK
P0,P1,P2,P3:
1.Dirty Read (Leitura Suja): Uma leitura suja ocorre quando uma transação lê dados
não confirmados de outra transação. Em outras palavras, uma transação lê dados que
foram modificados por outra transação e ainda não foram confirmados ou revertidos.
Isso pode resultar em inconsistências nos dados, pois a transação que realizou a
leitura suja pode tomar decisões com base em informações não confirmadas.
Leituras sujas são possíveis em níveis de isolamento mais baixos, como READ
UNCOMMITTED.
2.Fuzzy Read (Leitura Nebulosa): O termo "fuzzy read" não é amplamente usado no
contexto de modos de isolamento de banco de dados. No entanto, pode-se
interpretar uma "fuzzy read" como uma leitura que permite certa imprecisão ou
ambiguidade nos resultados. Isso geralmente ocorre quando o nível de isolamento
permite que outras transações insiram ou removam dados durante a leitura.
Consequentemente, as leituras subsequentes podem incluir resultados que não
estavam presentes na primeira leitura, resultando em resultados imprecisos ou
nebulosos.
39
outras transações inserem, atualizam ou excluem linhas que correspondem aos
critérios da consulta original. O fenômeno "phantom" é uma anomalia que ocorre em
níveis de isolamento que permitem leituras repetíveis, mas não garantem uma visão
consistente do conjunto de resultados entre as execuções da mesma consulta.
SQL Server:
•SERIALIZABLE (Serializável)
•SNAPSHOT (Instantâneo)
Oracle:
•SERIALIZABLE (Serializável)
PostgreSQL:
•SERIALIZABLE (Serializável)
39
É importante observar que, embora esses modos de isolamento sejam comumente
suportados pelos bancos de dados mencionados, cada banco de dados pode ter
opções adicionais específicas para configuração de isolamento ou extensões do
padrão ANSI. Além disso, cada banco de dados pode ter nomes e opções específicas
para seus modos de isolamento. Recomenda-se consultar a documentação oficial do
banco de dados específico para obter informações detalhadas sobre os modos de
isolamento suportados e suas configurações correspondentes.
SQL Server:
READ UNCOMMITTED:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMITTED:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SERIALIZABLE:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SNAPSHOT:
ALTER DATABASE [NomeDoBanco] SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE [NomeDoBanco] SET READ_COMMITTED_SNAPSHOT ON;
Oracle:
READ COMMITTED:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
READ WRITE:
SET TRANSACTION READ WRITE;
SERIALIZABLE:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
PostgreSQL:
READ COMMITTED:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
39
SERIALIZABLE:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
READ UNCOMMITTED:
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED;
39