2013-06-18 2 views
3

Lorsqu'un événement est déclenché à partir de la fonction de transaction de clôture de Laravel, les opérations de base de données dans les événements font-elles également partie de la transaction ou sont-elles en dehors de celle-ci?Transactions et événements dans Laravel 4

Snippet 1 
    Event::listen('fireme',function($data){ 
     User::where('votes', '>', 100)->update(array('status' => 2)); 
    }); 

Snippet 2 
    DB::transaction(function(){ 
      User::where('votes', '>', 100)->update(array('email' => '[email protected]')); 
      Event::fire('fireme',array('email' => '[email protected]')); 
    }); 

Est-ce que Snippet 1 appartient à la transaction définie sur Snippet 2?

+1

Cela semble très trivial de tester cela, il suffit d'augmenter en exception dans votre écouteur et voir si le reste de la transaction est annulée ou validée. –

Répondre

1

J'avais exactement la même question. Suite à la suggestion de @ alexandre-danault, je peux confirmer que les exceptions lancées dans un gestionnaire d'événements, où l'événement est déclenché à partir d'une transaction, provoqueront l'annulation de la transaction. Je pensais que mettre cette réponse pourrait vous éviter d'avoir à faire votre propre test en premier. Voici mes extraits de code (je ne suis pas en utilisant le formulaire de fermeture des transactions):

// I throw an exception from within this event handler 
Event::listen('transaction.statusChange', '[email protected]'); 

// Here's the transaction that fires the event 
DB::beginTransaction(); 
try { 
    $this->status = $status; 
    if (!$this->save()){ 
     throw new Exception('...'); 
    } 
    Event::fire('transaction.statusChange', ['transaction' => $this, 'status' => $status]); 
} catch(Exception $e){ 
    DB::rollback(); 
    // Log exception 

    return false; 
} 
DB::commit(); 
0

Si vous ne disposez que d'une connexion de base de données, et vous êtes dans une transaction, alors tout ce que vous faites dans la base de données doit être partie de cette transaction. Laravel n'ouvre pas de connexions de base de données supplémentaires pour les événements.