Механізм session blocking у Laravel запобігає виникненню race conditions та помилок у даних, контролюючи паралельний доступ до сесій. Ця функція гарантує цілісність даних під час виконання одночасних операцій.
# Як працює session blocking
Для активації блокування сесій необхідно мати:
- Cache driver із підтримкою атомарних блокувань (redis, memcached, dynamodb або database).
- Session driver, відмінний від cookie.
Route::post('/endpoint', function() {
// Логіка операції
})->block($lockSeconds = 5, $waitSeconds = 10);
# Практичне впровадження
Розглянемо реалізацію системи обробки платежів із контролем паралельних запитів:
<?php
namespace App\Http\Controllers;
use App\Models\Payment;
use Illuminate\Support\Facades\DB;
use App\Exceptions\PaymentException;
class PaymentController extends Controller
{
public function process(Request $request)
{
return DB::transaction(function() use ($request) {
// Перевірка, чи існує платіж і чи не був він уже оброблений
$payment = Payment::findOrFail($request->payment_id);
if ($payment->isProcessed()) {
throw new PaymentException('Payment already processed');
}
// Обробка платежу
$result = $this->paymentGateway->charge([
'amount' => $payment->amount,
'currency' => $payment->currency,
'token' => $request->payment_token
]);
$payment->markAsProcessed($result->transaction_id);
return response()->json([
'status' => 'success',
'transaction_id' => $result->transaction_id
]);
});
}
}
// routes/api.php
Route::post('/payments/process', [PaymentController::class, 'process'])->block(5, 10);
Цей підхід забезпечує:
- Захист від дублювання платежів.
- Очікування до 10 секунд для отримання блокування.
- Атомарність операцій завдяки database transactions.
- Коректну обробку паралельних запитів.
Session blocking — це надійний інструмент для керування паралельними запитами. Він гарантує цілісність даних у високонавантажених застосунках, зберігаючи лаконічність і чистоту коду в стилі Laravel.