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