Transações abertas
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!
[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
Curtidas 0
Respostas
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?
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
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:
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
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!
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
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
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..
No aguardo..
GOSTEI 0
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.
Não existem muitos registros na tabela. Aliás, atualmente existem apenas 20 registros.
GOSTEI 0
Rodolpho123
25/01/2006
Tente com outro tipo de componente de acesso, pois eu testei (não com ADO) e funcionou direitinho...
GOSTEI 0