Transações abertas

Firebird

25/01/2006

Pessoal, em um programa que estou fazendo existe um tela que acessa a tabela TAB1. Neste programa também tem uma thread que de tempos em tempos acessa a mesma tabela TAB1, em que faz apenas consultas. Quando a thread está sendo executada, é aberta uma transação para acesso à tabela TAB1.

[b:4755e5be53]Minha dúvida é:[/b:4755e5be53] No FB, enquanto uma transação estiver aberta, ou seja, enquanto estiver acessando uma tabela, é possível abrir outro acesso para edição à mesma tabela?
Pergunto isso, pois nesse programa poderá ocorrer casos em que estará sendo executada a thread que acessa TAB1 e ao mesmo tempo o usuário poderá abrir a tela de edição da tabela TAB1. Então, dará problema se o usuário tentar editar/criar um registro de TAB1 no momento em que a thread esteja fazendo sua consulta? Ou a criação/edição do registro simplesmente ficará bloqueada enquanto estiver aberta a transação da thread?

valeu!


Wbb

Wbb

Curtidas 0

Respostas

Wbb

Wbb

25/01/2006

Só para complementar...
No SQL Server, por exemplo, quando é aberta uma transação é possível bloquear todos os outros processos de acesso à mesma tabela, incluindo acesso para leitura. Isso porém não é um recurso default e tem que ser configurado.

E no FB? Como funciona esses processos de bloqueios? Ao abrir uma transação para acesso a uma tabela o que acontece se tentar acessar a mesma tabela através de outra conexão?


GOSTEI 0
Rodolpho123

Rodolpho123

25/01/2006

Se vc acessar uma tabela por uma transação, vc pode perfeitamente acessar a mesma tabela ou até o mesmo registro com outra transação e fazer o tipo de alteração que quiser.

O que pode acontecer é:
Trans.1- Vc edita o registro (ex: codcliente) de 0 para 1 e não comita
Trans.2- Vc faz uma consulta e se o seu componente estiver configurado para apenas enxergar dados comitados, vc verá o codcliente como 0.
Trans2.-Vc alterao codcliente para 2 e comita.
Trans1. - Vc comiita também.
Resultado; codcliente = 1

Isso se torna um problema, quando se é necessário ter um registro consistente (ex: quantidade de estoque). Para que isso não aconteça, o FB disponibiliza um comando chamado [b:49d4aa56b6]for update with lock[/b:49d4aa56b6], que bloqueia a quantidade de linhas que o seu select retornar, enquanto a transação não for finalizada, ex:

select codceliente from clientes for update with lock
where codcliente = 0



GOSTEI 0
Wbb

Wbb

25/01/2006

Fala Rodolpho!
Pelo que entendi, usando o [b:2d7012cbcb]for update with lock[/b:2d7012cbcb], se eu possuir uma consulta aberta tal como você mostrou no exemplo do Select, então os registros selecionados por essa consulta permanecerão inalterados até a conclusão da transação, mesmo que algum desses registros tenham sido alterados por meio de uma outra conexão? É isso mesmo?

Valeu!


GOSTEI 0
Wbb

Wbb

25/01/2006

Rodolpho, tentei usar sua sugestão do [b:1c5f04c621]for update with lock[/b:1c5f04c621] e o que está acontecendo é que ao executar ´open´ no código abaixo, a aplicação simplesmente trava. Tem idéia do motivo?

   with ADOQuery do
   begin
      Close;
      SQL.Clear;
      SQL.Add(´Select * from TAB1 for update with lock´);
      Open; [color=red]// trava a aplicação aqui[/color]
   end;



GOSTEI 0
Rodolpho123

Rodolpho123

25/01/2006

Sabe dizer se exite algum outro SELECT nesta tabela já efetuado pela sua transação? Eu nunca usei ADO, e não sei se tem que configurar alguma coisa na conexão. Essa tabela contém muitos registros?

No aguardo..


GOSTEI 0
Wbb

Wbb

25/01/2006

Não existe outro Select sendo executado (gerei um projeto de teste, à parte, assim como um BD teste também à parte).

Não existem muitos registros na tabela. Aliás, atualmente existem apenas 20 registros.


GOSTEI 0
Rodolpho123

Rodolpho123

25/01/2006

Tente com outro tipo de componente de acesso, pois eu testei (não com ADO) e funcionou direitinho...


GOSTEI 0
POSTAR