Для объединения нескольких запросов в одну транзакцию и реализации отката всех изменений в случае неуспешного выполнения любого из запросов в PHP с использованием класса PDO, вы можете воспользоваться методами `beginTransaction()`, `commit()` и `rollBack()`.
Во-первых, необходимо начать транзакцию, затем выполнять запросы и, в случае любого сбоя, откатить сделанные изменения. Пример кода ниже демонстрирует, как это сделать:
```php
<?php
try {
// Подключаемся к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
// Начинаем транзакцию
$pdo->beginTransaction();
// Выполняем несколько запросов
$stmt1 = $pdo->prepare("INSERT INTO table1 (column1) VALUES (:value1)");
$stmt1->execute([':value1' => 'Some value 1']);
$stmt2 = $pdo->prepare("UPDATE table2 SET column2 = :value2 WHERE id = :id");
$stmt2->execute([':value2' => 'Some value 2', ':id' => 1]);
$stmt3 = $pdo->prepare("DELETE FROM table3 WHERE column3 = :value3");
$stmt3->execute([':value3' => 'Some value 3']);
// Если все запросы выполнены успешно, фиксируем изменения
$pdo->commit();
echo "Все изменения сохранены успешно.";
} catch (Exception $e) {
// В случае ошибки, откатываем все изменения
$pdo->rollBack();
echo "Ошибка: " . $e->getMessage();
}
?>
```
### Объяснение кода:
1. **Подключение к базе данных:** Мы устанавливаем соединение с помощью PDO и настраиваем режим обработки ошибок.
2. **Начало транзакции:** Метод `beginTransaction()` начинает новую транзакцию.
3. **Выполнение запросов:** В данном примере выполняются три разных запроса: вставка, обновление и удаление. Если один из запросов не удастся, все последующие операции также отменяются.
4. **Фиксация изменений:** Если все запросы завершились успешно, вызывается `commit()` для зафиксирования всех изменений.
5. **Обработка ошибок:** В случае возникновения исключения (ошибки) выполняется `rollBack()` для отмены всех изменений, сделанных в транзакции, и выводится сообщение об ошибке.
### Блокировка всех операций:
При выполнении транзакции на уровне базы данных и использовании транзакций, блокировка будет применена автоматически на уровне записи, если это необходимо. Однако, для блокировки всех операций (например, исключение изменений в других потоках), вы можете использовать блокировки таблиц или другие механизмы блокировки, предоставляемые вашей СУБД. В общем случае, такой подход требует более сложной настройки, специфичной для конкретной базы данных и ее особенностей.