Doctrine2, transazioni e lazy-load

giugno 5, 2013
By

Sono incappato in un problema riguardante le transazioni con Doctrine2 in una applicazione Symfony che sto sviluppando attualmente
Avevvo bisogno di una transazione per una proprietà dell’utente
Il primo tentativo è stato di recuperare l’oggetto Utente tramite

public function someAction(Request $request){
$usr= $this->get('security.context')->getToken()->getUser();
$usr = $em->lock($usr, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
....
try{
  $amount = $usr->getSomeProperty();
  if($amount > $okValue){
    $amount--;
  }
  $usr->setSomeProperty($amount);
}

Le richieste concorrenti venivano bloccate correttamente finché quella bloccante non aveva finito, ma il valore di $amount non veniva modificato correttamente

Dopo un po’ di sbattimenti di testa ho scoperto che recuperare l’oggetto utente dal security context forniscce un oggettto completamente inizializzato, di modo che ogni richiesta concorrente aveva il proprio con il valore che aveva prima dell’inizializzazione della transazione

Ho modificato il mio codice in modo da recuperare un oggetto Utente dall’EntityManager

$originalUsr= $this->get('security.context')->getToken()->getUser();
$usr = $em->find('MyBundle:User',$originalUsr->getId(), \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);

In questo modo quando accedo all’entità e proprietà relative queste vengono “lazy loaded”, così il valore è coerente con l’ultima transazione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*