Обычно подключение к серверу остается открытым на протяжении работы сценария и завершается автоматически после завершения работы сценария. При необходимости можно завершить соединение раньше или просто завершить соединение явным образом. Такая потребность может возникнуть, если возможность своевременного отключения от сервера позволяет снизить нагрузку на сервер MySQL. Для разрыва соединения можно воспользоваться методом disconnect() , указав там дескриптор базы данных.
Листинг 20.10.
$dbh->disconnect();
Если сценарий запустил транзакцию с использованием метода begin_work() или значения 'AutoCommit' =>0 в вызове connect() , перед тем как вызвать метод discon-nect(), необходимо вызвать методы commit() или rollback(). Рассмотрим пример.
Листинг 20.11.
#! /usr /bin/perl
# загрузить модуль use DBI();
# присвоение значений переменным транзакции!
# предположим, что это получено через стандартный ввод $name = "Ian T";
$nat = "IN";
$dept = "HumanResources"; $pbasic = 55000; $pbonus = 7500;
# соединить
my $dbh = DBI-
>connect("DBI:mysql:database=master;host=l92.168.0.241","root", "secret",
'RaiseError'=> 1, 'AutoCommit'=> OJ);
# транзакция помещается в блок eval{}
# поэтому в случае ошибки можно будет сделать откат eval
{
# добавить запись с данными о работнике
$dbh->do ("INSERT INTO employees (ename, enationality) VALUES C$name', '$nat')");
# получить идентификатор автосчетчика для добавленной записи $id = $dbh->{'mysql_insertid'};
# добавить данные об отделе, в котором работает работник
$dbh->do("INSERT INTO
departments(eid,dept)VALUES('$id,,,$dept')");
# добавить данные о заработной плате
$dbh->do("INSERT INTO payroll (eid, pbasic, pbonus) VALUES
(,$id,,,$pbasic,,,$pbonus')");
# нет ошибок? Занести в базу данных! $dbh->commit ();
};
# в случае ошибки - откат!
if ($@)
{
print "Транзакция прервана: $@"; $dbh->rollback();
}
# очистить $dbh->disconnect();
Здесь транзакция включает добавление работника в базу данных, содержащую информацию о работниках. Для этого данные добавляются в три разные таблицы. Первый шаг заключается в подключении к базе данных с помощью метода connect() . Обратите внимание на появление в методе connect() параметра AutoCommit. Как было указано в главе 12, "Транзакции", это информирует MySQL о необходимости отключения автоматического выполнения команд SQL и о включении всех запросов в единый блок транзакции, который будет выполняться целиком.
После установления соединения, для вставки новых данных о работниках используются стандартные SQL-операторы INSERT. Эти операторы заключены в блок обработки исключительных ситуаций eval{... } . Суть в том, что при возникновении какой-либо ошибки, этот блок завершает свою работу и возвращает управление программе верхнего уровня. Ошибка, которая сохраняется в переменной Perl $@ (это сообщение об ошибке, сгенерированное блоком eval{... } ), приводит к немедленному откату - rollback() . При отсутствии ошибки, транзакция будет завершена методом commit() . Очевидно, что такой метод программирования будет работать только с таблицами, которые поддерживают работу с транзакциями, например, с таблицами типа InnoDB.
Оставляя все на потом
Альтернативой методу connect() является метод connect_cashed(), который сохраняет информацию об открытых соединениях с базой данных и в случае попытки открыть уже открытое соединение, возвращает объект дескриптора уже открытой базы данных (вместо того, чтобы сделать попытку повторно и открыть уже открытое соединение).
При работе с интерфейсом DBI необходимо быть предельно осторожным относительно открытых соединений с базой данных. Все базы данных имеют определенное ограничение на количество одновременно открытых соединений. Если максимальное количество параллельно работающих клиентов не задано, имеет смысл открыть нужное соединение и закрыть его сразу же, как только необходимость в нем отпала. Это делается во избежание ситуаций, когда сервер базы данных будет настолько перегружен, что он не сможет открыть ни одного нового соединения.
Для управления соединением можно воспользоваться дополнительными специализированными функциями, имеющимися в арсенале интерфейса DBI. Все они перечислены в табл. 20.1.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Управление соединением. Продолжение.
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Управление соединением | Все о MySQL. Выполнение запросов |