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