💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 在 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 教程的这一部分中,我们提到了事务。