Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Entendendo transações com o banco de dados Olá pessoal, Gostaria de saber qual é o momento exato em que um determinado registro é salvo/atualizado/deletado do banco em uma transação, se no momento em que invocamos o método "store()" do objeto Active Record ou se no momento em que invocamos o método "close()" da classe TTransaction? A necessidade de entendimento dessa particularidade surgiu pois estou desenvolvendo uma rotina (...
RK
Entendendo transações com o banco de dados  
Olá pessoal,

Gostaria de saber qual é o momento exato em que um determinado registro é salvo/atualizado/deletado do banco em uma transação, se no momento em que invocamos o método "store()" do objeto Active Record ou se no momento em que invocamos o método "close()" da classe TTransaction?

A necessidade de entendimento dessa particularidade surgiu pois estou desenvolvendo uma rotina (service) de envio de e-mail em massa que utiliza a classe PHPMailer, enviando individualmente os e-mails pré-agendados em uma tabela MySql (MyISAM). O service é disparado a cada segundo por meio do serviço "Cron" do servidor Ubuntu, o que acaba gerando muitas vezes execuções simultâneas da mesma rotina (o que é desejável para que um maior número de e-mails seja disparado).

Durante sua execução a rotina busca registros cuja coluna "status" seja igual a "P" (programado), envia o e-mail e atualiza seu status com "E" (enviado) ou "F" (falha). Minha preocupação é que duas ou mais rotinas executadas simultaneamente capturem o mesmo registro, enviando assim e-mails duplicados.
Com o entendimento da questão levantada no primeiro parágrafo eu poderei criar proteções para que isso não ocorra. Caso tenham uma ideia de como fazer isso favor indicar.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (2)


RK

Pessoal,

Depois de alguns testes práticos eu concluí o seguinte:

Em tabelas com engine MyISAM o registro é salvo no momento em que é chamado o método "store()" da classe TRecord, pois essa engine não suporta transações.
Em tabelas com engine InnoDB o registro é salvo no momento em que é chamado o método "close()" da classe TTransaction, uma vez que a transação inteira seja consistente (sem excessões durante sua execução).

As afirmações acima estão corretas?
WP

Afirmações corretas porem com términos equivocados , mas sim em resumo é isso mesmo.