在本章中,我们将处理事务。 首先,我们提供一些基本定义。 然后,我们介绍 Perl 脚本,该脚本显示如何在 Perl DBI 中处理事务。 我们还将讨论自动提交模式,这对于理解事务是必不可少的。
定义
事务 是针对一个或多个数据库中数据的数据库操作的基本单位。 事务中所有 SQL 语句的影响可以全部提交给数据库,也可以全部回滚。 在 自动提交模式 中,更改立即生效。 要处理事务,我们要么关闭自动提交模式,要么使用begin_work()
方法启动事务。 事务以commit()
或rollback()
方法结束。
默认情况下,数据库连接处于自动提交模式。 AutoCommit
数据库句柄属性用于设置或读取自动提交模式。
当AutoCommit
打开时,对begin_work()
的呼叫将AutoCommit
关闭。 commit()
和rollback()
方法重新打开AutoCommit
。 如果关闭AutoCommit
属性,然后再调用begin_work()
方法,则会收到一条错误消息,提示我们已经在事务中。
在 SQLite 中,除SELECT
以外的任何命令都将启动隐式事务。 同样,在事务中,诸如CREATE TABLE
…,VACUUM
和PRAGMA
之类的命令将在执行之前提交先前的更改。 手动事务以BEGIN TRANSACTION
语句开始,并以COMMIT
或ROLLBACK
语句结束。
SQLite 支持三种非标准事务级别:DEFERRED
,IMMEDIATE
和EXCLUSIVE
。
例子
现在,我们将有一些可用于事务处理的脚本。
我们创建一个Friends
表,并尝试用数据填充它。 但是,正如我们将看到的,数据不会被提交。
我们已经将AutoCommit
参数设置为 0。更改不会自动提交。 而且没有提交语句。 因此,更改不会写入数据库。
我们的数据库中没有Friends
表。
在第二个示例中,我们将使用commit()
方法将数据写入数据库。
当关闭自动提交模式时,每个语句都在事务内,直到我们调用commit()
方法为止。
所有更改都将写入数据库。
我们使用sqlite3
命令行工具验证是否已写入更改。
当事务中存在错误时,将回滚事务,并且不会将任何更改提交到数据库。
在代码示例中,自动提交已关闭。 有两个语句构成一个事务。 第二个 SQL 语句中有错误。 因此,该事务将回滚。
表名称不正确。 数据库中没有 Friend 表。
运行示例将显示此错误消息。 事务回滚。
即使第一个UPDATE
语句正确,在Friends
表中也没有发生任何变化。
正如我们在教程中已经提到的那样,默认模式是自动提交。 在这种模式下,我们可以使用begin_work()
方法开始新的事务,并使用commit()
或rollback()
完成它。 begin_work()
方法将关闭自动提交,commit()
和rollback()
方法将重新打开自动提交。
再次,我们有一个不正确的第二条 SQL 语句。 这次,我们没有明确关闭自动提交。
我们将把错误处理委托给handle_error()
子例程。
使用begin_work()
方法,我们开始一个新事务。 自动提交已关闭。
这两个语句构成一个事务。 第二个是不正确的。
当我们遇到错误时,将调用此子例程。 我们打印一条错误消息。 请注意,该脚本不会退出。
事务已回滚,我们没有退出脚本。 它继续。 回滚后,自动提交已重新打开。 在Friends
表中添加了新行。
我们可以从the handle_error()
子例程中看到我们的自定义错误消息。
一个新朋友被插入了桌子。