Perl MySQL事务

时间:2019-11-20 08:52:38  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用Perl DBI来确保数据的完整性,从而处理数据库事务。

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

数据库事务必须是A.C.I.D,它是原子的,一致的,隔离的且持久的:

  • 原子的:对数据库的操作必须全部发生,否则什么也不会发生。
    这有助于通过部分更新来避免数据不一致。

  • 一致性:确保事务不违反完整性约束。

  • 隔离:确保通过on操作进行的更改对其他并发操作可见。

  • 耐用:确保已承诺的交易将永久存在。

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

  • 将AutoCommit属性设置为false以启用事务。

  • 在eval块的末尾执行eval块中的操作,调用数据库句柄对象的commit()方法以提交更改。

  • 检查变量$ @是否有错误,并在发生错误时调用数据库的rollback()方法以回滚更改。

Perl MySQL交易示例

在此示例中,我们将:

  • 在链接表中插入一个新链接;获取所插入链接的最后一个插入ID。

  • 在标签表中插入一个新标签;获取插入标签的最后一个插入ID。

  • 通过将新行与来自第一个和第二个操作的链接ID和标签ID添加到link_tags表中,来关联插入的链接和标签。

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

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

以下是脚本的输出:

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

我们可以通过查询links,tag和link_tags表来验证交易:

SELECT * FROM links;
SELECT * FROM tags;
SELECT * FROM link_tags;

有用。

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