- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 4 meses atrás por Thiago Luiz.
-
AutorPosts
-
27 de junho de 2013 às 4:44 pm #105612Thiago LuizParticipante
Prezados(a)Bom dia!
Tenho O banco de dados oracle 11g, e apresenta constatemente a LINHA ALOCADA (FANPEDID), que é a tabela de pedidos. Então quando o Comercial, lança os pedidos, apresenta a linha alocada e executo o seguinte comando :
SELECT ss.sid,ss.serial#, ss.username, ss.osuser, ao.owner || ‘.’ || ao.object_name AS OBJECT_NAME
FROM v$session ss, v$lock lk, dba_objects ao
WHERE lk.sid = ss.sid
AND ss.username is not null
AND ao.object_id(+) = lk.id1
AND ao.object_name like ‘%FANPEDID%’;alter system kill session ‘50,32’ immediate
Seguem algumas explicações.
? Linha alocada não ocorre em modo Pesquisa. Se ocorrer é inconformidade do sistema e nos contate imediatamente;
? Linha alocada é uma proteção do sistema para que dois usuários não MODIFIQUEM o mesmo Pedido, NF, cadastro, etc;
? Linha alocada não trava o sistema. Se ocorrer é inconformidade do sistema e nos contate imediatamente;
? Se um usuário acessar o Pedido, alterar o modo para MODIFICAR e utilizar a tecla Page Down, Page Up para navegar entre eles, eventualmente poderá acessar o Pedido que está sendo alterado por outro usuário. Neste caso ocorrerá corretamente a mensagem de linha alocada;So que nem o prestador de serviços dono do ERP, não conseguiu identificar o problema ?
Então,quando executo esse comando, mata a sessão do usuário, caso o pedido seja novo.
O que foi criado, não é excluido, somente o que será criado.Tem alguma forma no Banco de tirar essa linha alocada, ou miminizar o impacto disso.
Pois, estamos sofrendo demais no ERP, em relação a esse rotina de inserçao de pedidos.Alguem poderia clarear a minha ideia para a soluçao ?
28 de junho de 2013 às 4:15 pm #105622lobomaudiegoParticipanteThiago Bom dia!,
Pelo que entendi fica-se locado a tabela de pedidos quando é feita a inserção:
1 – Verifique se seu banco é Enterprise Edition;
2 – Verifique se essa tabela possui index do tipo BITMAP, esse tipo de index causa lock em algumas ocasiões de inserção.
3 – verifique a sessão que está travando as outras:
Col sess format a20 heading "User"
Col ib heading ""
Col sid heading "Sid"
col ki for a2 heading "ki"
col serial for 999999 heading "Serial"select (select username from v$session where sid=a.sid) sess,
'@k' as ki,
a.sid,
(select serial# from v$session where sid=a.sid) serial,
' is blocking ' ib,
(select username from v$session where sid=b.sid) sess,
'@k' as ki,
b.sid,
(select serial# from v$session where sid=b.sid) serial
from v$lock a, v$lock b
where a.block = 1
and b.request > 0
and a.id1 = b.id1
and a.id2 = b.id2
/
4 – Verifique o que ela está fazendo:SET LINESIZE 300
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A20
COLUMN kill_pid FORMAT A18
COLUMN machine FORMAT A15
COLUMN wait_class FORMAT A15
COLUMN kill FORMAT A2
COLUMN os_username FORMAT a18 HEADING 'O/S User'
COLUMN sw for 99999S
COLUMN kill_sess for a50
COLUMN module for a35SELECT '@k' as kill,
s.sid,
s.serial#,
p.spid,
s.sql_id,
s.module,
s.logon_time,
s.sql_exec_start,
s.username,
s.osuser as os_username,
REPLACE(REPLACE(S.MACHINE, 'BR-LIHI', ''), 'BR-LIHI-', '') AS MACHINE,
s.program,
s.wait_class,
s.wait_time,
s.seconds_in_wait as sw,
'kill -9 '|| spid as kill_pid,
'alter system kill session '||chr(39)||s.sid||', '||s.serial#||chr(39)|| ' immediate;' as kill_sess
FROM v$session s
JOIN v$process p ON p.addr = s.paddr
WHERE s.sid = '&id'
OR UPPER(s.username) = upper('&us')
OR upper(s.osuser) = upper('&os')
ORDER BY s.SECONDS_IN_WAIT DESC
/5 -Pegue o SQL_ID e verifique o comando executado:
set linesize 300
col sql_fulltext for a100 worSELECT SQL_ID,
EXECUTIONS,
sql_fulltext
from v$sql
where sql_id = '&sqlid'
/Se for lock devido a algum DELETE, UPDATE é erro de aplicação, sendo assim os desenvolvedores tem que corrigir.
Att,
Diego Monterio
28 de junho de 2013 às 9:46 pm #105629Thiago LuizParticipanteOla Diego Boa tarde!
Obrigado pela resposta!
Eu nao tenho um conhecimento avançado em BD 11G. A situaçao do LOCK ocorre quando vai modificar um pedido entende e fazer a inserção. O ERP é um MRP entende, entao sao varias formas de fazer a inserção do pedido.Fluxo do Pedido,Telemarketing CRM, pedido. Na maioria das vezes ocorre na rotina de telemarketing CRM.
O Banco que nós temos é Oracle 11G.
Qual a finalidade dessa Query?
Ela manda alterar os Variáveis de Substituição (ID), US, OS. O que seria esses 3 parametros quando sao solicitados para digitar?SELECT ‘@k’ as kill,
s.sid,
s.serial#,
p.spid,
s.sql_id,
s.module,
s.logon_time,
s.sql_exec_start,
s.username,
s.osuser as os_username,
REPLACE(REPLACE(S.MACHINE, ‘BR-LIHI’, ”), ‘BR-LIHI-‘, ”) AS MACHINE,
s.program,
s.wait_class,
s.wait_time,
s.seconds_in_wait as sw,
‘kill -9 ‘|| spid as kill_pid,
‘alter system kill session ‘||chr(39)||s.sid||’, ‘||s.serial#||chr(39)|| ‘ immediate;’ as kill_sess
FROM v$session s
JOIN v$process p ON p.addr = s.paddr
WHERE s.sid = ‘&id’
OR UPPER(s.username) = upper(‘&us’)
OR upper(s.osuser) = upper(‘&os’)
ORDER BY s.SECONDS_IN_WAIT DESC
/A outra query
SELECT SQL_ID,
EXECUTIONS,
sql_fulltext
from v$sql
where sql_id = ‘&sqlid’
/Como vou executar isso,em que ocasião ?
Tem alguma coisa, que eu possa fazer para minimizar, essa questão?
Obrigado!
-
AutorPosts
- Você deve fazer login para responder a este tópico.