Транзакции в MySQL с помощью Perl

Описание: в этой статье вы узнаете, как обрабатывать транзакции базы данных, используя Perl DBI для обеспечения целостности данных.
По определению, транзакция базы данных — это набор операторов SQL, который выполняется способом «все или ничего». Если все операторы SQL выполнены успешно, транзакция считается успешной. Сбой любого оператора SQL приведет к откату системы до исходного состояния, чтобы предотвратить несогласованность данных.
Транзакция базы данных должна быть ACID, которая является атомарной, последовательной, изолированной и долговечной:
- Атомарный: операции с базой данных должны либо все происходить, либо ничего не происходит. Это помогает избежать несогласованности данных путем частичного обновления.
- Согласованно: убедиться, что транзакция не нарушает ограничения целостности.
- Изолированный: чтобы убедиться, что изменения, внесенные операцией on, становятся видимыми для других параллельных операций.
- Долговечность: гарантировать, что совершенные транзакции будут существовать постоянно.
Perl DBI предоставляет набор API, который позволяет вам эффективно работать с транзакциями. Для обработки транзакций в Perl DBI вы делаете следующие шаги:
- Установите атрибут AutoCommit в false включения транзакции.
- Выполните операции в блоке eval, в конце блока eval вызовите метод commit() объекта дескриптора базы данных, чтобы зафиксировать изменения.
- Проверьте переменную $@ на наличие ошибок и вызовите метод rollback() базы данных, чтобы откатить изменения, если произошла ошибка.
Пример транзакции Perl MySQL
В этом примере мы будем:
- Вставьте новую ссылку в таблицу links; получить последний идентификатор вставки вставленной ссылки.
- Вставьте новый тег в таблицу tags; получить последний идентификатор вставки вставленного тега.
- Свяжите вставленную ссылку и тег, добавив в таблицу link_tags новую строку с идентификатором ссылки и идентификатором тега из первой и второй операций.
Мы завернем три операции внутри транзакции. Следующий скрипт иллюстрирует обработку транзакции с использованием Perl DBI:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # для функции say()
use DBI;
say "Демонстрация транзакций в MySQL с помощью Perl";
# Конфигурация баз данных MySQL
my $dsn = "DBI:mysql:perlmysqldb";
my $username = "root";
my $password = '';
# Подключение к базе данных MySQL
my %attr = (RaiseError=>1, # включена обработка ошибок
AutoCommit=>0); # транзакция включена
my $dbh = DBI->connect($dsn,$username,$password, \%attr);
eval{
# вставить новую ссылку
my $sql = "INSERT INTO links(title,url,target)
VALUES(?,?,?)";
my $sth = $dbh->prepare($sql);
$sth->execute("IT Блог. Администрирование серверов на Основе Linux","https://andreyex.ru/","_blank");
# получить последний идентификатор ссылки вставки
my $link_id = $dbh->{q{mysql_insertid}};
# вставить новый тег
$sql = "INSERT INTO tags(tag) VALUES(?)";
$sth = $dbh->prepare($sql);
$sth->execute('Perl');
# получить последний идентификатор вставки тега
my $tag_id = $dbh->{q{mysql_insertid}};
# вставка новой связи между ссылкой и тегом
$sql = "INSERT INTO link_tags(link_id,tag_id)
VALUES(?,?)";
$sth = $dbh->prepare($sql);
$sth->execute($link_id,$tag_id);
# если все в порядке, зафиксируйте в базе данных
$dbh->commit();
say "Ссылка и тег были вставлены и успешно связаны!";
};
if($@){
say "Ошибка при вставке ссылки и тега: $@";
$dbh->rollback();
}
# отключитесь от базы данных MySQL
$dbh->disconnect();
Обратите внимание, что выражение $dbh->{q{mysql_insertid}} возвращает идентификатор последней вставки.
Ниже приведен вывод сценария:
Демонстрация транзакций в MySQL с помощью Perl Ссылка и тег были вставлены и успешно связаны!
Мы можем проверить транзакцию, запрашивая таблицы links, tags и link_tags:
SELECT * FROM links;
SELECT * FROM tags;
SELECT * FROM link_tags;
Все работает.
В этой статье, мы показали вам, как для обработки транзакций базы данных MySQL в Perl, используя методы commit() и rollback() объекта handle базы данных.
Редактор: AndreyEx
