Como todos sabem, o banco de dados Dameng suporta acesso simultâneo e modificação de dados por vários usuários. No trabalho real, pode haver casos em que várias transações acessam e modificam os mesmos dados ao mesmo tempo. Quando uma transação está ocupando um bloqueio de recurso, outra transação está solicitando um bloqueio neste recurso que conflita com o primeiro bloqueio. Digite, o bloqueio ocorre. Nesse ponto, a transação bloqueada permanecerá suspensa até que a transação que contém o bloqueio desista do recurso bloqueado. Este artigo mostrará como usar a visualização de desempenho dinâmico correspondente para visualizar o bloqueio e como resolver o bloqueio.
O ambiente experimental deste artigo: Ambiente de demonstração: DM Database Server x64 V7.1.6.46-Build (2018.02.08-89107) ENT
1. Crie uma tabela de teste e insira dados
Tabela de construção:
2. Gerar bloqueio TID em T1
Execute a operação de atualização e não envie, as operações específicas são as seguintes:
3. Abra uma nova sessão
3.1 Executar uma operação de seleção em uma nova sessão
Pode-se observar que devido ao mecanismo de múltiplas versões do MVCC, a escrita não bloqueará a leitura, portanto a operação de seleção pode prosseguir normalmente. Mas a transação anterior não foi confirmada, então o resultado da verificação ainda é o valor da versão antiga, que é o valor antes da atualização.
3.2 Realizar operações DML em uma nova sessão
Nesse ponto, como a operação de exclusão precisa adicionar o mesmo tipo de bloqueio da operação de atualização anterior, ocorre o bloqueio e a transação atual é suspensa.
4. Verifique se há bloqueio
Quando ocorre o bloqueio, podemos verificar o estado do bloqueio no banco de dados atual através da visão v $ lock
No resultado, podemos ver que a transação 2399 está bloqueada e a transação que o bloqueia é 2393.
Da mesma forma, também podemos descobrir quem está bloqueando quem por meio da visualização V $ TRXWAIT,
Obtenha o mesmo resultado, a transação com ID 2399 está aguardando a transação com ID 2393 e o tempo de espera é de 1071599 milissegundos.
A seguir, procure as sessões correspondentes às duas transações através da visão V $ SESSIONS
Você pode obter o ID da sessão correspondente às duas transações e à instrução SQL atualmente em execução, e pode saber quais instruções SQL estão bloqueando.
5. Soluções de bloqueio
De acordo com os requisitos, existem duas soluções.
5.1 Confirme ou reverta a transação de bloqueio.
Com base no acima, podemos ver que o ID da sessão da transação que causou o bloqueio é 2410147992. Neste ponto, só precisamos confirmar ou reverter a transação na sessão, o bloqueio será naturalmente liberado e o bloqueio resolvido.
5.2 Fechar a sessão de bloqueio
Da mesma forma, também podemos usar o procedimento do sistema SP_CLOSE_SESSION (SESS_ID) para fechar a sessão correspondente, o uso específico é o seguinte.
Nesse ponto, o bloqueio é liberado e a operação de exclusão pode prosseguir sem problemas.