Niveis Transacionais

Firebird

29/09/2005

Inicio uma transação assim:

Transacao.TransactionID := 1; Transacao.IsolationLevel := xilREPEATABLEREAD; Dm.Trans_Conect.StartTransaction(Transacao);


Onde transacao é uma variavel do tipo TTransactionDesc e Trans_Conect é meu SqlConnection. O que acho que pode acontecer? Devo dar para cada transação um valor diferente, tipo: Cliente = 1, Estoque = 2, Fornec = 3 e etc...? O que quero dizer com isso? É o seguinte: Veja que meu TransactionID é igual a 1. Digamos que eu abrir essa transação para cadastrar cliente. Se por ventura eu abrir uma transação para Produtos, com o mesmo valor(TransactionID = 1) tambem, e se por ventura alguém terminar primeiro e der um Commit(transacao), a outra pessoa(usuário) não conseguirá gravar os seu dados, certo?(visto que o banco já ´commitou´ a transação. Eu penso que é assim. Se for assim, então terei que gerar um valor para cada transação, certo? Alguém sugere algo, que não precise dar valor a cada transação individualmente? Assim: Cliente = 1, Estoque = 2, Fornec = 3 etc..? Desde já agradeço a todos.


Paulo

Paulo

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

29/09/2005

Colega,

A ID esta restrita à instância da aplicação. Não se preocupe com o SGBD, pois este ID não lhe é enviado.
Observe:
http://forum.clubedelphi.net/viewtopic.php?t=49868
http://forum.clubedelphi.net/viewtopic.php?t=50909
http://forum.clubedelphi.net/viewtopic.php?t=53559
http://forum.clubedelphi.net/viewtopic.php?t=61246

T+


GOSTEI 0
Paulo

Paulo

29/09/2005

Tá havendo um paradoxo aqui, ou eu não estou entendendo(o q é provável,eh!eh!), então me perdoe, mas veja só. Nos exemplos(links) q vc me mandou, li todos. Só me responda uma coisa. Então terei que definir para cada transação, uma ID, senão, eu abro uma ID = 1 para cadastro de cliente e abro ID = 1 para cadastro de produtos, o SGDB, vai fazer o q nessa situação? Q transação ele vai fechar caso der um COMMIT?(o COMMIT será para ID = 1, certo? Então ele fechará o Cliente ou o Produto?) Mas tem uma situação que não foi colocado aqui. O COMMIT do formulário(se é Cliente ou Produtos), tem haver com tudo isso? Agora outra situação. Se tenho dois departamentos que na empresa que abre o mesmo Formulário(Ex: Clientes). Um abriu primeiro que o outro, então dará o COMMIT primeiro que o outro. Como será? O SGDB, permitirá duas transações com mesma ID? Se for assim, então não há problemas, pode abrir 100 transações com mesma ID que tá tudo bem. Ele diz, abriu 100, uma fechou, então tenho 99 ainda para fechar. É mais ou menos assim? Caso seja isso, então, posso trabalhar com a mesma ID para qualquer transação que está tudo bem, sem estresse. Quando falo de SGDB, falo de FB, ok?


GOSTEI 0
Vinicius2k

Vinicius2k

29/09/2005

Colega,

Só me responda uma coisa. Então terei que definir para cada transação, uma ID, senão, eu abro uma ID = 1 para cadastro de cliente e abro ID = 1 para cadastro de produtos, o SGDB, vai fazer o q nessa situação? Q transação ele vai fechar caso der um COMMIT?(o COMMIT será para ID = 1, certo? Então ele fechará o Cliente ou o Produto?)

Vc não conseguirá abrir a ID = 1 para cadastro de produtos pq ela está sendo utilizada para cadastro de cliente. Logo, o commit será para cliente.

Mas tem uma situação que não foi colocado aqui. O COMMIT do formulário(se é Cliente ou Produtos), tem haver com tudo isso? Agora outra situação. Se tenho dois departamentos que na empresa que abre o mesmo Formulário(Ex: Clientes). Um abriu primeiro que o outro, então dará o COMMIT primeiro que o outro. Como será? O SGDB, permitirá duas transações com mesma ID? Se for assim, então não há problemas, pode abrir 100 transações com mesma ID que tá tudo bem. Ele diz, abriu 100, uma fechou, então tenho 99 ainda para fechar. É mais ou menos assim?

O ´X´ da questão é: O ID de transação do dbExpress não faz nenhuma diferença para o SGBD. Não importa 100 usuários abrindo a ID = 1 porque a [b:7a9e55caed]ID é da aplicação[/b:7a9e55caed]. É apenas um identificador da transação que vc quer trabalhar no momento pq o TSQLConnection pode trabalhar com várias ao mesmo tempo. É um parametro local.

Eu diria que em 99¬ dos casos vc irá utilizar apenas a ID = 1, a não ser que sua aplicação permita, por exemplo, um cadastro dentro de outro. Exemplo: Vc abre a transação de ID = 1 para alterar um produto, mas dentro do cadastro de produtos vc pode cadastrar uma categoria, caso ela não exista, então, a transação para cadastro da categoria deve ser ID = 2 pq a ID = 1 ainda está aberta para a alteração do produto.

Na prática, este exemplo é muito raro, pq vc deve manter as transações curtas, então, não seria uma boa prática manter a transação ID = 1 aberta enquanto o usuário faz a digitação, a não ser em casos de travamento de registro para alteração, onde vc precisa manter a transação aberta para que o outro usuário não possa alterar o registro. Mas isto é travamento pessimista, uma questão para outro tópico. :)

Blz? Se não tiver entendido, é só postar novamente.
T+


GOSTEI 0
POSTAR