Transaction'lar
Transaction'lar, transaction içindeki işlemlerin ya hepsinin çalıştırılmasını ya da hiçbirinin çalıştırılmamasını güvence altına alır. Karmaşık işlemlerde veri tutarlılığını sağlamak için işe yararlar.
Transaction kullanmanın en basit yolu şöyle görünür:
$database->beginTransaction();
try {
$database->query('DELETE FROM articles WHERE id = ?', $id);
$database->query('INSERT INTO audit_log', [
'article_id' => $id,
'action' => 'delete'
]);
$database->commit();
} catch (\Exception $e) {
$database->rollBack();
throw $e;
}
Aynı sonuca transaction() metoduyla çok daha şık biçimde ulaşabilirsiniz. Bu metot, transaction içinde
çalıştırılan bir callback alır. Callback istisna fırlatmadan çalışırsa transaction otomatik olarak commit edilir. Bir
istisna oluşursa transaction geri alınır ve istisna daha ileriye yayılır.
$database->transaction(function ($database) use ($id) {
$database->query('DELETE FROM articles WHERE id = ?', $id);
$database->query('INSERT INTO audit_log', [
'article_id' => $id,
'action' => 'delete'
]);
});
transaction() çağrıları iç içe geçebilir; bu da her biri kendi transaction'ını yöneten metotları
birleştirmeyi kolaylaştırır. Veritabanına BEGIN/COMMIT olarak yalnızca en dıştaki transaction
gönderilir; içteki çağrılar yalnızca iç içe geçme derinliğini izler. Bir transaction() callback'inin
içinde beginTransaction(), commit() ya da rollBack() metotlarını elle çağırmak
LogicException fırlatır.
transaction() metodu değer de döndürebilir:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // güncellenen satır sayısını döndürür
});