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.

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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.