Resumo : neste tutorial, você aprenderá como lidar com transações de banco de dados usando Perl DBI para garantir a integridade dos dados.
Por definição, uma transação de banco de dados é um conjunto de instruções SQL executadas do modo tudo ou nada. Se todas as instruções SQL forem executadas com sucesso, a transação será considerada bem-sucedida. Uma falha em qualquer instrução SQL fará com que o sistema volte ao seu estado original para evitar inconsistência de dados.
Uma transação de banco de dados deve ser ACID, que é atômica, consistente, isolada e durável:
- Atômico : todas as operações no banco de dados devem ocorrer ou nada ocorre. Isso ajuda a evitar inconsistência de dados por meio de uma atualização parcial.
- Consistente : para garantir que a transação não viole as restrições de integridade.
- Isolado : para garantir que a alteração feita por uma operação se torne visível para outras operações simultâneas.
- Durável : para garantir que as transações comprometidas sobreviverão permanentemente.
Perl DBI fornece um conjunto de APIs que permite lidar com transações de maneira eficaz. Para lidar com transações em Perl DBI, execute as seguintes etapas:
- Defina
AutoCommit
o atributo comofalse
para ativar a transação. - Execute operações em um
eval
bloco, ao final doeval
bloco, chame ocommit()
método do objeto handle do banco de dados para confirmar as alterações. - Verifique se há erros na variável
$@
e chame orollback()
método do banco de dados para reverter as alterações se ocorrer um erro.
Exemplo de transação Perl MySQL
Neste exemplo, iremos:
- Insira um novo link na
links
tabela; obtenha o último ID de inserção do link inserido. - Insira uma nova tag na
tags
tabela; obtenha o último ID de inserção da tag inserida. - Associe o link e a tag inseridos adicionando uma nova linha à
link_tags
tabela com o ID do link e o ID da tag da primeira e da segunda operações.
Envolveremos as três operações dentro de uma transação. O script a seguir ilustra como lidar com a transação usando Perl DBI:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say() function
use DBI;
say "Perl MySQL Transaction Demo";
# MySQL database configurations
my $dsn = "DBI:mysql:perlmysqldb";
my $username = "root";
my $password = '';
# connect to MySQL database
my %attr = (RaiseError=>1, # error handling enabled
AutoCommit=>0); # transaction enabled
my $dbh = DBI->connect($dsn,$username,$password, \%attr);
eval{
# insert a new link
my $sql = "INSERT INTO links(title,url,target)
VALUES(?,?,?)";
my $sth = $dbh->prepare($sql);
$sth->execute("Comprehensive Perl Archive Network","http://www.cpan.org/","_blank");
# get last insert id of the link
my $link_id = $dbh->{q{mysql_insertid}};
# insert a new tag
$sql = "INSERT INTO tags(tag) VALUES(?)";
$sth = $dbh->prepare($sql);
$sth->execute('Perl');
# get last insert id of the tag
my $tag_id = $dbh->{q{mysql_insertid}};
# insert a new link and tag relationship
$sql = "INSERT INTO link_tags(link_id,tag_id)
VALUES(?,?)";
$sth = $dbh->prepare($sql);
$sth->execute($link_id,$tag_id);
# if everything is OK, commit to the database
$dbh->commit();
say "Link and tag have been inserted and associated successfully!";
};
if($@){
say "Error inserting the link and tag: $@";
$dbh->rollback();
}
# disconnect from the MySQL database
$dbh->disconnect();
Linguagem de código: Perl ( perl )
Observe que a $dbh->{q{mysql_insertid}}
expressão retorna o último ID de inserção.
A seguir está a saída do script:
Perl MySQL Transaction Demo
Link and tag have been inserted and associated successfully!
Podemos verificar a transação consultando as tabelas links
e :tags
link_tags
SELECT * FROM links;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT * FROM tags;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT * FROM link_tags;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Funciona.
Neste tutorial, mostramos como lidar com transações de banco de dados MySQL em Perl usando os métodos commit()
e rollback()
do objeto identificador de banco de dados.