Compartilhando conhecimento com o mundo

Com tecnologia do Blogger.

Pesquisa

Download

Blogger Tricks

Blogger Themes

Visitas

Assuntos

12/16/2013

Quando o Lock Exclusivo Realmente não é Lock Exclusivo - Informix


Este artigo que iremos abordar e demonstrar uma situação que lock exclusivo em uma tabela não é realmente exclusivo (ou que achávamos que era exclusivo), um analista questionou que uma tabela dele tinha um campo chamado ID e este campo tinha vários registros repetidos na tabela e pela lógica da programação dele isso não deveria ocorrer (o campo ID não é um campo serial e sim um decimal) a lógica da programação do analista era uma operação de select para ver o último valor do campo ID e depois um lock na tabela para inserir o registro. Foi questionado o porque o Informix não estaria "lockando" os dados como deveria fazer.

Primeira Cenário

1 - Primeiro vamos dar um select em uma tabela em modo lock table exclusivo
SQL:   New  Run  Modify  Use-editor  Output  Choose  Save  Info  Drop  Exit
Run the current SQL statements.

----------------------- desenv@desenv ---------- Press CTRL-W for Help --------

begin work;
lock table aidf in exclusive mode;
select count(*) from aidf;

 Table locked.
2 - Checando, a tabela realmente esta em lock;
[s343:informix]$/export/home/informix> echo "select owner, username, hostname, dbsname, tabname, type from 
syssessions s, sysmaster:syslocks l where sid = owner AND tabname not like 'sys%';" | dbaccess sysmaster

Database selected.

owner     35677
username  informix
hostname  s343.ms
dbsname   desenv
tabname   aidf
type      X

1 row(s) retrieved.

Database closed.
3 - Checando o processo que esta lockando a tabela
[s343:informix]$/export/home/informix> onstat -g sql 35677

IBM Informix Dynamic Server Version 11.70.FC2 -- On-Line -- Up 17 days 23:48:28 -- 1575104 Kbytes


Sess       SQL            Current            Iso Lock       SQL  ISAM F.E. 
Id         Stmt type      Database           Lvl Mode       ERR  ERR  Vers  Explain    
35677      -              desenv             LC  Not Wait   0    0    9.24  Off        

Last parsed SQL statement :
  select count(*) from aidf
4 - Com o lock ainda rodando vou tentar acessar esta tabela - vou tentar fazer um select
[s343:informix]$/export/home/informix> echo "select count(*) from aidf" | dbaccess desenv

Database selected.

  252: Cannot get system information for table.

  113: ISAM error:  the file is locked.
Error in line 1
Near character position 25

Database closed.
5 - Vamos fazer uma outra pesquisa rodando com o ISOLATION dirty read - Consegui ler a tabela mesmo ela estando em lock;
[s343:informix]$/export/home/informix> echo "set isolation dirty read; select count(*) from aidf" | dbaccess desenv

Database selected.

Isolation level set.

      (count(*))

            3000

1 row(s) retrieved.

Database closed.
Como não temos habilitado para os usuários o ISOLATION DIRTY READ o que deve estar ocorrendo são dois (ou mais) selects consecutivos e logo em seguida deve estar vindo dois insert (só com o campo ID igual para os dois);

Solução

Foi recomendado para o analista alterar a lógica do programa em vez de (select, lock e insert) que estava sendo feito para (lock, select e insert) para ter certeza que não ocorrer dois (ou mais) selects consecutivos;

Referencia

0 comentários:

Enviar um comentário