Fórum Sobre transações #53906
22/11/2005
0
Este tópico pode iniciar uma discussão interessante ( ou não hehe ).
Tenho duas dúvidas:
- comandos do tipo SELECT abrem transações no Firebird?
Supomos que eu tenha um sistema com um formulário de consulta. Quando o formulário é aberto, executa um SELECT em uma Query que traz registros do banco segundo alguns critérios. Pergunto: no momento que a instrução Open da Query é executada, uma transação associada à tabela da Query é aberta no Firebird? Perguntando de outra maneira: existiria risco de deadlock devido à suposta transação aberta pela instrução SELECT nessa consulta?
- em um DataSet, a transação é aberta no momento da execução dos métodos Insert/Update, ou só no momento da gravação dos dados ( Post )?
Agora, temos um formulário de cadastro, com componentes DataWare ( TDBEdits, etc ). Quando o método Insert ( ou Update ) é executado para manipulação de registros, a transação é aberta? Ou ela só é aberta no momento da execução do método Post, quando o usuário vai gravar os dados? Se o primeiro caso for verdadeiro, seria melhor utilizar componentes normais ( TEdits ) combinados com instruções INSERT/UPDATE que seriam executadas somente após todos os dados serem digitados? Claro que isso seria mais trabalhoso também...
Abraços
Tnaires
Curtir tópico
+ 0Posts
23/11/2005
Afarias
mesmo só a seleção de registros (SELECT) precisa estar no contexto de uma transação no Firebird
|Supomos que eu tenha um sistema com um formulário de consulta.
|Quando o formulário é aberto, executa um SELECT em uma Query que
|traz registros do banco segundo alguns critérios. Pergunto: no momento
|que a instrução Open da Query é executada, uma transação associada à
|tabela da Query é aberta no Firebird?
quem faz isso automático (ou não) é o componente de acesso (tipo o IBX) e não o Firebird. O Firebird precisa que vc abra uma transação *antes* de executar qualquer comando nos dados, mesmo um select.
|Perguntando de outra maneira: existiria risco de deadlock devido à
|suposta transação aberta pela instrução SELECT nessa consulta?
NÃO. Simplesmente abrir uma transação não bloqueia um registro. Q q bloqueia o registro é uma alteração no mesmo (update) ou lock explícito (select for update)
|em um DataSet, a transação é aberta no momento da execução dos
|métodos Insert/Update, ou só no momento da gravação dos dados (
|Post )?
Depende completamente do DataSet. Isso é algo dos componentes de acesso e não do banco de dados.
Para as suas outras questões, sem saber quais componentes usa e como os configura, é impossível responder.
T+
Gostei + 0
23/11/2005
Tnaires
Antes de mais nada, obrigado pelas respostas, já foram de grande ajuda.
A suíte de componentes que estou usando atualmente para o Firebird é o IBX. Sei que não é o adequado, devido ao risco de futura incompatibilidade, mas eu uso porque é free.
O nível de isolamento do objeto IBTransaction é Read Commited, e os DataSets em questão são IBDataSets.
Obrigado, abraços
Gostei + 0
23/11/2005
Afarias
|registros, a transação é aberta?
no caso do IBDataSet a transação já está aberta desde que vc o abriu (open).
|Se o primeiro caso for verdadeiro, seria melhor utilizar componentes
|normais ( TEdits ) combinados com instruções INSERT/UPDATE que
|seriam executadas somente após todos os dados serem digitados?
se é melhor depende muito da aplicação. é melhor em termos de manter transações curtas, mas nem toda aplicação precisa se preocupar com isso -- dai tem q avaliar o custo/benefício.
T+
Gostei + 0
23/11/2005
Tnaires
Eu pensava o seguinte:
Se a máquina A abrisse uma transação pra uma tabela ( um SELECT por exemplo ), e depois a máquina B abrisse outra transação pra mesma tabela e tentasse commitar ( com a primeira transação pendente ), daria deadlock.
Mas isso só aconteceria se ambas as máquinas abrissem o mesmo registro para edição, correto?
Abraços
Gostei + 0
23/11/2005
Afarias
|registro para edição, correto?
isso. se a primeira alterar o registro x e antes de ´comitar´ a segunda tentar alterar o mesmo registro.
T+
Gostei + 0
23/11/2005
Tnaires
Abraços
Gostei + 0
26/11/2005
Raserafim
Gostei + 0
27/11/2005
Afarias
|por um outro usuário?
ao tentar alterar o registro, vc receberá um erro informando q o registro está bloqueado -- mas sua transação tem q estar configurada como ´NO WAIT´ -- do contrário, em vez do erro sua aplicação apenas ficará ´parada´ aguardando a liberação do registro
T+
Gostei + 0
07/12/2005
Rik3500
Gostei + 0
08/12/2005
Afarias
não.
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)