Теперь, когда вы подключены через PDO, прежде чем приступить к выполнению запросов, вы должны сначала понять, как PDO управляет транзакциями.
Транзакции поддерживают четыре основные характеристики (ACID):
атомарность
Последовательность
Изоляция
Долговечность
С точки зрения непрофессионала, любая операция, выполняемая в рамках транзакции, даже если она выполняется поэтапно, гарантированно будет безопасно применена к базе данных и зафиксирована без вмешательства со стороны других соединений.
Операции транзакций также могут быть автоматически отменены по запросу (при условии, что они еще не были зафиксированы), что упрощает обработку ошибок в сценариях.
Транзакции обычно реализуются путем «накопления» пакета изменений и одновременного повышения их эффективности. Преимущество этого подхода заключается в том, что это может значительно повысить эффективность этих изменений.
Другими словами, транзакции могут сделать сценарии быстрее и потенциально более надежными (хотя для получения таких преимуществ транзакции необходимо использовать правильно).
К сожалению, не каждая база данных поддерживает транзакции, поэтому PDO необходимо запускать в так называемом режиме «автофиксации» при первом открытии соединения.
Режим автоматической фиксации означает, что каждый выполняемый запрос имеет свою собственную неявную транзакцию, если база данных поддерживает ее, или никакой, если база данных не поддерживает транзакции.
Если требуется транзакция, ее необходимо запустить с помощью метода PDO::beginTransaction(). Если базовый драйвер не поддерживает транзакции, генерируется исключение PDOException (это серьезная ошибка, независимо от настроек обработки ошибок).
После запуска транзакции ее можно завершить с помощью PDO::commit() или PDO::rollBack(), в зависимости от того, был ли код транзакции выполнен успешно.
Примечание. PDO проверяет наличие у него возможностей транзакций только на уровне драйвера. Если какое-то условие выполнения означает, что транзакция недоступна, а служба базы данных принимает запрос на запуск транзакции, PDO::beginTransaction() все равно вернет TRUE без ошибок. Хорошим примером этого является попытка использовать транзакции в таблице MyISAM в базе данных MySQL.
Когда сценарий завершается или соединение вот-вот будет закрыто, если есть невыполненная транзакция, PDO автоматически откатит транзакцию. Эта мера безопасности помогает избежать несоответствий в случае неожиданного завершения сценария — если транзакция не зафиксирована явно, предполагается, что что-то пошло не так, поэтому для обеспечения безопасности данных выполняется откат.
Примечание. Автоматический откат может произойти только после запуска транзакции через PDO::beginTransaction(). Если вы вручную отправляете запрос на запуск транзакции, PDO не имеет возможности узнать об этом и не может отменить его при необходимости.
Выполните пакетную обработку в транзакции:
В следующем примере предположим, что для нового сотрудника создан набор записей, которому присвоен идентификатор 23. Помимо регистрации основных данных человека, необходимо еще и зарегистрировать его зарплату.
Оба обновления легко выполнить по отдельности, но, включив их в вызовы PDO::beginTransaction() и PDO::commit(), вы гарантируете, что никто другой не сможет увидеть изменения, пока они не будут завершены.
Если возникает ошибка, блок catch откатывает все изменения, произошедшие с момента запуска транзакции, и печатает сообщение об ошибке.
<?phptry { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connectedn";} catch (Exception $e) { die("Невозможно подключиться: " . $e->getMessage());}try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("вставить в штатные (id, first, Last) значения (23, 'Джо) ', 'Bloggs')"); $dbh->exec("вставить в значение paychange (id, sum,changedate) (23, 50000, NOW())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage();}?>
Вы не ограничены внесением изменений в транзакцию, вы также можете выполнять сложные запросы для извлечения данных и использовать эту информацию для создания большего количества изменений и запросов, когда транзакция активна, вы можете гарантировать, что другие не смогут вносить изменения, пока транзакция активна; операция продолжается.