HJ
TTransaction::close() não funciona
Boa tarde Pessoal,
Tenho um método, que utiliza n' sub-metodos. Em cada sub-método, pode haver a necessidade de abrir uma conexão com o banco de dados. Com isso fica da seguinte forma:
Tenho um método, que utiliza n' sub-metodos. Em cada sub-método, pode haver a necessidade de abrir uma conexão com o banco de dados. Com isso fica da seguinte forma:
<?phppublic function metodoPai(){ $this->metodoFilho();}public function metodoFilho(){TTransaction::open('nome');.......TTransaction::close();}?>
Ok até aqui.
Porém, no momento da execução do método PAI, fico analisando o número de sessões abertas no ORACLE, e vejo que a cada segundo, o número de sessões(transações) abertas para o usuário do banco aumenta.
Eu dou o seguinte comando para verificar essa questão (SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME='nome').
E a cada select executado, o número de conexões aumenta.
O problema está no fato de existir um limite de transações no oracle, atualmente no meu banco de dados está com um número máximo aproximado de 160.
Quando atinge este número, a aplicação emite um erro e aborta.
Se eu colocar no final do meu método-PAI, novamente um TTransaction::close(), o problema com multiplas transações é resolvido, porém dá erro na clase TTransaction, informando que não havia nenhuma transação aberta para ser fechada. Possivelmente devido realmente não ser a todo instante que exista uma conexão perdida. Minha duvida é justamente ai. Por que existem conexões perdidas, sendo que em TODOS os métodos, eu sempre abro e FECHO na transação?
Alguém já pegou este tipo de problema?
Obrigado
Geralmente trabalho com 1 transação só, aberta na função principal.
Há algum motivo específico para abrir uma transação em cada função "filha"?
Olá Nataniel,
Eu até poderia tentar colocar apenas uma única transação, mas existem algumas funções que precisam de fato serem "concluídas", pois elas gravam registros em tabelas que dentro do mesmo processamento poderão ser requisitadas. Se eu deixar para fechar a transação apenas no final do processo como um todo, somente neste momento alguns dados serão persistidos e não terei como acessá-los durante o mesmo processo.
Na verdade eu já tinha tentado deixar apenas uma transação, mas como o problema também aconteceu, pensei em deixá-los independentes para cada função, caso seja requisitada.
Um outro ponto importante é que em algum momento eu posso chamar a própria função Pai dentro ela mesma. Com isso, eu acabo reiniciando o processo, sem ter chegado ao fim do primeiro, fazendo com que não feche a transação do primeiro.
Eu realmente estou precisando resolver isso, pois meu projeto está em jogo e estou quase jogando a toalha. Gostaria de contratar alguém que domine o framework para resolver isto pra mim. Sabe me indicar alguém, ou até mesmo você quem sabe...
Aguardo retorno. Obrigado.
Hélio, acho muito difícil que haja um bug que deixe algumas conexões perdidas, até porque internamente é a própria PDO que controla essa parte.
Ainda não entendi exatamente o motivo pelo qual você utiliza várias transações:
"Se eu deixar para fechar a transação apenas no final do processo como um todo, somente neste momento alguns dados serão persistidos e não terei como acessá-los durante o mesmo processo."
Na prática, utilizando apenas 1 transação, qualquer alteração realizada estará visível a todas as demais operações desta transação, não havendo a necessidade de esperar o fechamento da transação.
Outro detalhe:
"Um outro ponto importante é que em algum momento eu posso chamar a própria função Pai dentro ela mesma. Com isso, eu acabo reiniciando o processo, sem ter chegado ao fim do primeiro, fazendo com que não feche a transação do primeiro."
Você está usando recursão? Não pode ser aí o problema?