Sobre transações
Olá
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
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
Curtidas 0
Respostas
Afarias
22/11/2005
|- comandos do tipo SELECT abrem transações no Firebird?
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+
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
Tnaires
22/11/2005
Olá
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
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
Afarias
22/11/2005
|Quando o método Insert ( ou Update ) é executado para manipulação de
|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+
|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
Tnaires
22/11/2005
OK, obrigado! :D
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
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
Afarias
22/11/2005
|Mas isso só aconteceria se ambas as máquinas abrissem o mesmo
|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+
|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
Tnaires
22/11/2005
Beleza. Foi tudo muito esclarecedor.
Abraços
Abraços
GOSTEI 0
Raserafim
22/11/2005
como fico sabendo, na aplicação, se um registro já está sendo editado por um outro usuário?
GOSTEI 0
Afarias
22/11/2005
|como fico sabendo, na aplicação, se um registro já está sendo editado
|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+
|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
Rik3500
22/11/2005
Quando se faz a instrução Select no Firebird com IBX se inicia uma transação, tudo bem. Ma antes de se fechar a tabela é necessário fazer o commit ou rolback?
GOSTEI 0
Afarias
22/11/2005
|Ma antes de se fechar a tabela é necessário fazer o commit ou rolback?
não.
T+
não.
T+
GOSTEI 0