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
});
versiyon: 4.x