Fórum Transações abertas #54973
25/01/2006
0
[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
Curtir tópico
+ 0Posts
26/01/2006
Wbb
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
26/01/2006
Rodolpho123
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
26/01/2006
Wbb
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
30/01/2006
Wbb
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
31/01/2006
Rodolpho123
No aguardo..
Gostei + 0
31/01/2006
Wbb
Não existem muitos registros na tabela. Aliás, atualmente existem apenas 20 registros.
Gostei + 0
31/01/2006
Rodolpho123
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)