Транзакции

Транзакции гарантируют, что либо все операции в рамках транзакции будут выполнены, либо ни одна из них не будет выполнена. Они полезны для обеспечения согласованности данных при более сложных операциях.

Самый простой способ использования транзакций выглядит следующим образом:

$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;
}

Гораздо элегантнее то же самое можно записать с помощью метода transaction(). В качестве параметра он принимает колбэк, который выполняется в транзакции. Если колбэк выполняется без исключения, транзакция автоматически подтверждается. Если возникает исключение, транзакция отменяется (rollback), а исключение распространяется дальше.

$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() также может возвращать значения:

$count = $database->transaction(function ($database) {
	$result = $database->query('UPDATE users SET active = ?', true);
	return $result->getRowCount(); // возвращает количество обновленных строк
});
версия: 4.0