PHP транзакции и автоматичен ангажимент
Сега знаете как да се свързвате с бази данни с помощта на PDO. Но преди да можете да изпълнявате заявки, трябва да разберете как PDO управлява транзакциите. Ако не сте срещали транзакции преди, те имат четири основни свойства, те са атомност, последователност, изолация и издръжливост (ACID). С прости думи, всички действия, предприети в рамките на транзакция, са гарантирани, че ще бъдат изпълнени безопасно спрямо базата данни и няма да бъдат засегнати от други връзки към тази база данни, дори ако тези действия се извършват на няколко стъпки. Транзакционните операции могат да бъдат върнати при поискване (ако транзакцията все още не е извършена), което опростява обработката на грешки в скриптовете.
Механизмът на транзакцията се изпълнява чрез „временно запазване“ на всички промени и след това прилагане на тези промени като цяло. Това позволява да се постигне рязко повишаване на ефективността на такива промени. С други думи, транзакциите могат да направят вашите скриптове по-бързи и потенциално по-стабилни (но трябва да използвате правилно този механизъм, за да го направите).
За съжаление, не всички бази данни поддържат транзакции, така че PDO работи в така наречения режим на „автоматичен ангажимент“, когато се създаде връзка. Режимът Autocommit означава, че всяка заявка към базата данни, която правите, е имплицитно обвита в транзакция, ако СУБД ги поддържа. Ако базата данни не поддържа този механизъм, заявката се обработва без транзакция. За да посочите изрично началото на транзакция, трябва да използвате метода PDO::beginTransaction(). Ако драйверът не поддържа механизма за транзакции, ще бъде хвърлено PDOException (независимо от избрания метод за обработка на грешки: такива ситуации савинаги голям бъг). След като извършите транзакция, можете да я извършите с метода PDO::commit() или да върнете обратно с метода PDO::rollBack(), в зависимост от това дали вашият код в транзакцията е изпълнен успешно или не.
PDO проверява дали транзакциите могат да се използват само на ниво драйвер. Ако по някаква причина механизмът за транзакция не е наличен, но сървърът на базата данни е приел заявката за отваряне на транзакция, PDO::beginTransaction() ще върнеTRUE без грешка.
Пример би бил опит за използване на транзакции в MyISAM таблици в MySQL база данни.
Когато скрипт прекъсне или връзката се затвори, PDO автоматично връща обратно всички чакащи транзакции. Това се прави, за да се предотвратят нарушения на целостта на базата данни в случаите, когато скриптът прекратява неочаквано. Ако не сте извършили изрично промените, се предполага, че нещо се е объркало. Следователно връщането на промените е най-безопасният изход.
Промените ще бъдат върнати автоматично само ако транзакцията е отворена с метода PDO::beginTransaction(). Ако транзакция е отворена ръчно в текста на заявката, PDO няма да знае за това по никакъв начин и съответно няма да може да предприеме действия, ако се случи нещо лошо.
Пример #1 Изпълнение на пакет от промени в транзакция
В следващия пример, да кажем, че създаваме множество записи за нов служител с номера >PDO::beginTransaction() и PDO::commit(), можем да гарантираме, че никой не вижда тези промени, докато не бъдат завършени. Ако нещо се обърка, блокът catch ще върне всички промени от началото на транзакцията и ще отпечата съобщение за грешка.
опитайте $dbh = ново PDO ( 'odbc:SAMPLE' , 'db2inst1' , 'ibmdb2' , array( PDO :: ATTR_PERSISTENT =>вярно )); echo "Свързан\n" ; > catch ( Изключение $e ) die( "Неуспешно свързване: " . $e -> getMessage ()); >
опитайте < $dbh -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh -> beginTransaction(); $dbh -> exec( "вмъкване в персонал (id, първи, последен) стойности (23, 'Joe', 'Bloggs')" ); $dbh -> exec( "вмъкване в промяна на заплатата (идентификатор, сума, дата на промяна) стойности (23, 50000, СЕГА())" ); $dbh -> ангажирам ();
> catch ( Изключение $e ) $dbh -> връщане назад(); echo "Грешка: ". $e -> getMessage(); > ?>
Не сте ограничени по никакъв начин в броя на заявките в рамките на една транзакция; можете също така да изпълнявате сложни заявки за извличане на данни и след това да ги използвате за създаване на други заявки за актуализиране и извличане на данни; ако транзакцията е активна, можете да сте сигурни, че никой не може да промени вашите данни, докато работите с тях. За повече информация относно транзакциите вижте документацията за вашия сървър на база данни.