Gerenciamento de Locks e Sessões no Oracle Database

Arts and Humanities4.16 KB

Configuração de Perfil e Usuários no Oracle

Passo 1: Criar Perfil para Usuário

O primeiro passo consiste em criar um perfil para limitar os recursos do usuário, como o número de sessões simultâneas.

CREATE PROFILE perfil_padrao LIMIT SESSIONS_PER_USER 1;

Passo 2: Criar Primeiro Usuário para Simulação

Criaremos o usuário usr1 associado ao perfil criado anteriormente.

CREATE USER usr1 
PROFILE perfil_padrao 
IDENTIFIED BY oracle 
QUOTA UNLIMITED ON users ACCOUNT UNLOCK;

Passo 3: Criar Segundo Usuário para Simulação

Da mesma forma, criaremos o usuário usr2 para simular o bloqueio (lock).

CREATE USER usr2 
PROFILE perfil_padrao 
IDENTIFIED BY oracle 
QUOTA UNLIMITED ON users ACCOUNT UNLOCK;

Gerenciamento de Permissões

Conceder e Revogar Acessos

Utilize os comandos abaixo para gerenciar as permissões de criação de tabela e conexão para os usuários usr1 e usr2.

-- Comando para conceder permissão
GRANT CREATE TABLE, CONNECT TO usr1, usr2;

-- Comando para revogar permissões
REVOKE CREATE TABLE, CONNECT FROM usr1, usr2;

Simulação de Transações e Bloqueios (Locks)

Passo 5: Criar Tabela de Produtos

Conecte-se com o usuário usr1 e crie a tabela de produtos para os testes.

CONNECT usr1/oracle;

CREATE TABLE produto (
  id_produto VARCHAR2(5) PRIMARY KEY,
  valor NUMBER(10,2)
);

INSERT INTO produto VALUES (1, 50);
INSERT INTO produto VALUES (2, 5);

Passo 6 e 7: Validar Operações e Conceder Acesso ao usr2

Após inserir os dados, é necessário efetivar a transação e permitir que o usr2 realize atualizações.

COMMIT;

GRANT UPDATE ON produto TO usr2;

Passo 8: Realizar Update no Usuário 1

No usuário usr1, realize um update atualizando a coluna valor para 35, onde o id_produto é igual a 1.

UPDATE produto SET valor = 35 WHERE id_produto = 1;

Passo 9: Simular o Lock no Usuário 2

No usuário usr2, em outra sessão, tentaremos atualizar a mesma linha. Observaremos que o lock entra em ação, deixando a sessão em espera.

UPDATE usr1.produto SET valor = 36 WHERE id_produto = 1;

Identificação e Resolução de Bloqueios

Passo 10: Detectar Sessões Bloqueadoras

O comando abaixo identifica quais usuários estão bloqueando outras sessões no banco de dados.

SELECT username FROM v$session 
WHERE sid IN (SELECT blocking_session FROM v$session);

Passo 11: Verificar Usuários Aguardando Commit

Identifique quais sessões estão aguardando a liberação de um recurso (blocking_session não nulo).

SELECT sid, username, blocking_session FROM v$session 
WHERE blocking_session IS NOT NULL;

Passo 12: Relatório Completo de Bloqueios

Utilize a consulta abaixo para listar tanto quem está bloqueado quanto quem é o causador do bloqueio.

SELECT sid, username, blocking_session FROM v$session 
WHERE blocking_session IS NOT NULL 
UNION ALL 
SELECT a.sid, a.username, a.blocking_session 
FROM v$session a, v$session b 
WHERE a.sid = b.blocking_session;

-- Consulta formatada com aliases
SELECT sid AS "Qual SID", username AS "Usuario", blocking_session AS "Bloqueando a Sessao" 
FROM v$session 
WHERE blocking_session IS NOT NULL 
UNION ALL 
SELECT a.sid, a.username, a.blocking_session 
FROM v$session a, v$session b 
WHERE a.sid = b.blocking_session;

Passo 13 e 14: Finalizar a Sessão Bloqueadora

Para resolver o lock, identifique o SID e o SERIAL# da sessão do usr1 e finalize-a.

-- Identificando SID e SERIAL#
SELECT sid, serial# FROM v$session WHERE username = 'usr1';

-- Finalizando a sessão de forma imediata
ALTER SYSTEM KILL SESSION '27,316' IMMEDIATE;

Download

PDF Word HTML