veilletech.fr
22 oct. Feed du jour
#08 LARAVEL Article

Laravel 13.38 : lire sa propre écriture sur réplica

Lire sa propre écriture : deux secondes suffisent.

Laravel 13.38.0 ajoute le middleware PreventStaleDatabaseReads, qui envoie vers la connexion d'écriture les lectures d'un utilisateur pendant deux secondes après son écriture, et DB::usingWritePdo() pour forcer les lectures d'un callback sur le primaire. Le retard des réplicas ne fait plus afficher l'ancienne valeur à celui qui vient d'enregistrer.

2 min de lectureintermédiairevidéo 1:19
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Le middleware PreventStaleDatabaseReads
  3. DB::usingWritePdo()
  4. Autres changements du lot
  5. Comment s'y prendre
  6. À retenir

Ce qui se passe

Avec des connexions de lecture et d'écriture séparées, un réplica peut avoir du retard sur le serveur d'écriture : l'utilisateur enregistre une modification, recharge la page, et voit l'ancienne valeur. Laravel 13.38.0 ajoute deux outils contre ce défaut, tous deux de Jack Bayliss.

Le middleware PreventStaleDatabaseReads

Optionnel. Quand une requête écrit sur la connexion par défaut, il enregistre un horodatage dans la session. Pendant les deux secondes suivantes, les lectures de cet utilisateur vont sur la connexion d'écriture ; ensuite elles retournent sur les réplicas.

bootstrap/app.phpPHP
use Illuminate\Foundation\Http\Middleware\PreventStaleDatabaseReads;

->withMiddleware(function (Middleware $middleware) {
    $middleware->web(append: [PreventStaleDatabaseReads::class]);
})

Pour une fenêtre plus longue sur un groupe de routes, ::for() prend un nombre de secondes :

PHP
Route::middleware(PreventStaleDatabaseReads::for(10))->group(function () {
    Route::put('/profil', [ProfilController::class, 'update']);
    Route::get('/profil', [ProfilController::class, 'show']);
});

Limites : il exige une session, ne suit que la connexion par défaut, et ne protège que l'utilisateur qui a écrit. Les autres peuvent toujours lire des données plus anciennes depuis un réplica. (PR #62078)

DB::usingWritePdo()

onWriteConnection() ne vaut que pour la requête qu'on démarre : une relation chargée ensuite lit encore depuis un réplica. usingWritePdo() envoie toutes les lectures d'un callback sur la connexion d'écriture, puis restaure le réglage précédent, même si le callback lève une exception. (PR #62099)

PHP
$brouillons = DB::usingWritePdo(fn () => User::query()
    ->where('email', $email)
    ->first()
    ?->posts()
    ->whereNull('published_at')
    ->get());

Autres changements du lot

Comment s'y prendre

  1. Mesurer le retard réel de vos réplicas avant de choisir la fenêtre.
  2. Ajouter le middleware au groupe web, ou seulement aux routes de formulaires avec ::for().
  3. Utiliser DB::usingWritePdo() pour les lectures enchaînées qui doivent voir une écriture toute récente.

Source : Laravel News, 21 octobre 2026. Source en anglais.