Perl MySQL Transaction

摘要:在本教程中,您将学习如何使用 Perl DBI 处理数据库事务以确保数据的完整性。

根据定义,数据库事务是一组以“全有或全无”方式执行的 SQL 语句。如果所有SQL语句执行成功,则认为事务成功。任何一条SQL语句失败都会导致系统回滚到原来的状态,防止数据不一致。

数据库事务必须是 ACID,即原子性、一致性、隔离性和持久性:

  • 原子性:针对数据库的操作必须全部发生,或者什么都不发生。这有助于避免部分更新导致的数据不一致。
  • 一致性:确保事务不违反完整性约束。
  • 隔离:确保 on 操作所做的更改对其他并发操作可见。
  • 持久:确保已提交的事务永久存在。

Perl DBI 提供了一组 API,允许您有效地处理事务。要在 Perl DBI 中处理事务,请执行以下步骤:

  • AutoCommit属性设置为false以启用事务。
  • eval块中执行操作,在eval块的末尾,调用数据库句柄对象的commit()方法来提交更改。
  • 检查变量$@是否有错误,如果发生错误,则调用数据库的rollback()方法回滚更改。

Perl MySQL 事务示例

在此示例中,我们将:

  • 将新链接插入links表;获取插入链接的最后一个插入ID
  • 将新标签插入tags表中;获取插入标签的最后一个插入ID。
  • 通过使用第一个和第二个操作中的链接 id 和标签 id 添加新行到link_tags表,将插入的链接和标签关联起来。
Perl MySQL Transaction - Sample Tables

我们将把这三个操作包装在一个事务中。以下脚本说明了如何使用 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();Code language: Perl (perl)

请注意, $dbh->{q{mysql_insertid}}表达式返回最后一个插入 ID。

以下是脚本的输出:

Perl MySQL Transaction Demo
Link and tag have been inserted and associated successfully!

我们可以通过查询linkstagslink_tags表来验证交易:

SELECT * FROM links;Code language: SQL (Structured Query Language) (sql)
Perl mysql 事务 - 链接表
SELECT * FROM tags;Code language: SQL (Structured Query Language) (sql)
Perl mysql 事务 - 标签表
SELECT * FROM link_tags;Code language: SQL (Structured Query Language) (sql)

有用。

在本教程中,我们向您展示了如何使用数据库句柄对象的commit()rollback()方法在 Perl 中处理 MySQL 数据库事务。

本教程有帮助吗?