2016-01-01 10 views
6

sto cercando di capire come utilizzare/test correttamente il lockforupdate, ma ho trovato non è funzionare come quello che mi aspettavolaravel lockforupdate (blocco pessimistico)

questo è solo testando

public function index() { 
     return dd(\DB::transaction(function() { 
      if (\Auth::guard('user')->check()) { 
       $model = \App\Models\User::find(1)->lockForUpdate(); 
       sleep(60); 
       $model->point = 100000; 
       $model->save(); 
      } else { 
       $model = \App\Models\User::find(1); 
       $model->point = 999; 
       $model->save(); 
      } 

      return $model; 
     })); 
} 

provo a testare in 2 browser, browser 1 utente loggato e browser 2 non loggato, browser 1 hit refresh, quindi ci sarà lockforupdate e sleep 60 secondi prima dell'aggiornamento

in 60 secondi, vado browser 2 e premo aggiorna, tuttavia il record non è bloccato, controllo phpmyadm e il record viene aggiornato (entro il 60 secondi grilletto di blocco dal browser 1)

ma dopo 60 secondi, il record è stato modificato ancora una volta dal browser 1 (Point 100000)

Anch'io equivoco il lockforupdate è usare per? o lo collaudo in modo errato?

quello che mi aspettavo è la riga non dovrebbe essere modificata dal browser 2 nei primi 60 secondi (pagina vuota con carico favicon o errore di buttare?)

https://laravel.com/docs/5.2/queries#pessimistic-locking

e ho fatto qualche ricerca, ma ancora non riesco a capire che cosa di diverso tra sharedLock (BLOCCO IN MODALITÀ SHARE) e lockForUpdate (FOR UPDATE)

btw ho confermato il database è InnoDB

risposta

9

Questo lavoro, finalmente, ma ancora non capisco cosa s haredLock (BLOCCO IN MODALITÀ SHARE) e lockForUpdate (FOR UPDATE) diverso

public function index() { 
     return dd(\DB::transaction(function() { 
      if (\Auth::guard('user')->check()) { 
       $model = \App\Models\User::lockForUpdate()->find(1); 
       sleep(30); 
       $model->point = 100000; 
       $model->save(); 
      } else { 
       $model = \App\Models\User::lockForUpdate()->find(1); 
       $model->point = $model->point + 1; 
       $model->save(); 
      } 

      return $model; 
     })); 
    } 
+2

Dalla documentazione: https://laravel.com/docs/5.2/queries#pessimistic-locking serrature sharedLock solo per scrivere, lockForUpdate impedisce anche che vengano selezionati – cdarken

+0

I blocchi di transazione vengono utilizzati per gestire il database tra accesso a più utenti. Se il tuo tavolo è bloccato, l'altro utente non può accedervi. Quindi i dati sono gestiti correttamente. –