drWeb Cache lock kullanırken yapılan işleme göre key adı vererek başka işlemleri etkilemesini engelleyebilirsiniz:
$key = 'wallet:'.$request->user()->id; // wallet:5
Cache::lock($ey, 10)->get(function () {
// ...
});
Bu işlemi bir controller yöntemi içinde yaptığınızı düşünün. Sadece giriş yapmış kullanıcı (5), sadece o controller yöntemini kullanan bir işlem yaptığında kilitten etkilenecek.
Veri tabanı düzeyinde ise transaction ve lock birlikte kullanacaksınız:
DB::transaction(function() {
$balance = Payment::sharedLock()
->sum('amount');
//...
});
Böylece bakiye hesaplanırken satırların değişmesi engellenmiş olacak ve herhangi bir hata olursa transaction yapılan tüm veri tabanı işlemlerini geri alacak.
Bu tür sistemlerle uğraşırken ayrıca firstOrCreate, updateOrCreate gibi race-condition riski taşıyan yöntemlerden de kaçınmanız lazım.