借助于我们提供的详细注释,清单1中的代码还是很容易理解的。然而,您可能已经注意到了一个问题,那就是异常的输出。为简单起见,我们使用了一个die()语句来输出与数据库服务器连接有关的异常;可是,失败的查询是不会被返回的。这个实现可能无法满足您的特殊需要,但是我们这里只是用于演示而已。
当然,为了演示事务处理功能,我们PostgreSQL类还需另外再添加五个事务相关的方法:Begintransaction()、commit()、rollback()、setsavepoint()和rollbacktosavepoint()。通过阅读上一篇文章对事务知识的介绍,现在读者对于下面代码的理解应该不成问题了。
$this->query('START TRANSACTION');
}
function commit() {
$this->query('COMMIT');
}
function rollback() {
$this->query('ROLLBACK');
}
function setsavepoint($savepointname){
$this->query("SAVEPOINT $savepointname");
}
function rollbacktosavepoint($savepointname){
$this->query("ROLLBACK TO SAVEPOINT $savepointname");
}
因为这些命令通常不会出错,所以我们没有引入异常处理,从而使我们的示例代码更加简洁。
三、pg_query()函数
函数pg_query()的运转稍微有些复杂,如果不全面理解其行为的话,就有可能对我们的事务逻辑造成严重的影响。这主要是pg_query()确定成功和失败的方式所引起的。当pg_query()被调用时,任何成功执行的查询都会返回一个资源标识符。 这看起来是并没什么,但是别忘了:一次成功的查询并不意味着一切搞定。举例来说,假如您执行下列命令:
echo pg_query($query);
根据之前插入的测试信息,这次查询没有更新任何数据,因为通过名字Rob不会显示任何参与者。然而,pg_query()仍然会煞有介事地向您返回一个资源标识符,因为这次查询是有效的。但是这对事务来说却是一个大问题,因为您需要明确地知道是否真输出了预期的内容。为了正确处理该事务,我们需要同时检查查询的正确运行情况和是否有数据受到影响。为此,我们可以使用pg_affected_rows()函数来达此目的。举例来说,我们可以像下面这样来改写代码,以确定该查询是否有效,以及是否有数据受到了影响,如下所示:
$result = pg_query($query);
if ($result AND pg_affected_rows($result) == 1) echo "TRUE";
else echo "FALSE";
这将返回FALSE。这是结合PHP使用PostgreSQL数据库的事务的关键,所以我们将在下面的示例中加以详解。