# 在 PostgreSQL 中使用 PHP 进行事务

> 原文： [http://zetcode.com/db/postgresqlphp/trans/](http://zetcode.com/db/postgresqlphp/trans/)

在本章中，我们将处理事务。 首先，我们提供一些基本定义。 然后，我们将使用事务的示例程序。

事务是针对一个或多个数据库中数据的数据库操作的基本单位。 事务中的 SQL 语句可以全部提交给数据库，也可以全部回滚。 为了数据安全和完整性，将 SQL 语句放入事务中。

在 PostgreSQL PHP 中，每个 SQL 语句在执行后都会提交给数据库。 并非所有语言绑定都是如此。 例如，在 Python 的`psycopg2`模块中，默认情况下，必须使用`commit()`方法显式提交所有更改。

在直接 SQL 中，事务以`BEGIN TRANSACTION`语句开始，并以`END TRANSACTION`和`COMMIT`语句结束。 在 PostgreSQL 中，这些语句是`BEGIN`和`COMMIT`。 在某些驱动程序中，这些语句被省略。 它们由驱动处理。 在 PHP 中没有这样的方法，我们必须使用直接 SQL。 （在 PHP PDO 中有这样的方法。）

```php
<?php 

$host = "localhost"; 
$user = "user12"; 
$pass = "34klq*"; 
$db = "testdb"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n"); 

pg_query("BEGIN") or die("Could not start transaction\n");

$res1 = pg_query("DELETE FROM cars WHERE id IN (1, 9)");
$res2 = pg_query("INSERT INTO cars VALUES (1, 'BMW', 36000), (9, 'Audi', 52642)");

if ($res1 and $res2) {
    echo "Commiting transaction\n";
    pg_query("COMMIT") or die("Transaction commit failed\n");
} else {
    echo "Rolling back transaction\n";
    pg_query("ROLLBACK") or die("Transaction rollback failed\n");;
}

pg_close($con); 

?>

```

我们有汽车表。 我们要交换第一行和最后一行。 我们分两个步骤进行。 首先，我们删除两行。 然后，我们将其插入并交换 ID。 这两个操作需要放在事务中。 如果第一步成功而第二步失败，则数据将被破坏。 因此，我们需要全部完成或什么都不做。

```php
pg_query("BEGIN") or die("Could not start transaction\n");

```

我们通过发出`BEGIN`语句开始新的事务。

```php
$res1 = pg_query("DELETE FROM cars WHERE id IN (1, 9)");
$res2 = pg_query("INSERT INTO cars VALUES (1, 'BMW', 36000), (9, 'Audi', 52642)");

```

这是两个修改表的 SQL 语句。 两个`pg_query()`函数都返回`true`或`false`布尔值，指示 SQL 命令是否失败。

```php
if ($res1 and $res2) {
    echo "Commiting transaction\n";
    pg_query("COMMIT") or die("Transaction commit failed\n");
} else {
    echo "Rolling back transaction\n";
    pg_query("ROLLBACK") or die("Transaction rollback failed\n");;
}

```

如果两个函数调用都返回`true`，则使用`COMMIT`语句提交事务。 否则，我们将使用`ROLLBACK`语句回滚更改。

```php
$ php transaction.php
Commiting transaction

testdb=# SELECT * FROM cars ORDER BY id;
 id |    name    | price  
----+------------+--------
  1 | BMW        |  36000
  2 | Mercedes   |  57127
  3 | Skoda      |   9000
  4 | Volvo      |  29000
  5 | Bentley    | 350000
  6 | Citroen    |  21000
  7 | Hummer     |  41400
  8 | Volkswagen |  21606
  9 | Audi       |  52642
(9 rows)

```

行已成功交换。

在 PostgreSQL PHP 教程的这一部分中，我们提到了事务。