下面是详细讲解“PHP使用pdo实现事务处理操作示例”的完整攻略。
什么是PDO?
PDO,全称 PHP Data Objects,是PHP 5.1 引入的一组数据库操作 API,它提供了一个面向对象的入口,支持多种数据库的操作,如 MySQL、SQLite、Oracle 等,提供了一致的接口,可以让我们更加方便地操作不同种类的关系数据库。
什么是事务处理?
事务处理是指,在同一时间内,对关系数据库进行某一项或多项操作的集合,这些操作被看作一个单独的工作单位,并且要么全部成功,要么全部失败。
PDO 实现事务处理的步骤
- 首先需要连接到数据库,可以使用PDO构造函数来完成。示例代码如下:
php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$pdo = new PDO($dsn, $username, $password);
- 接下来设置 PDO 的错误模式,可以将错误模式设置为
PDO::ERRMODE_EXCEPTION
,这样在发生错误时会抛出异常。示例代码如下:
php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- 开始事务,可以使用 PDO 的
beginTransaction()
函数。示例代码如下:
php
$pdo->beginTransaction();
- 执行 SQL 语句,可以使用 PDO 的
exec()
函数或query()
函数。在执行 SQL 语句时出现错误会触发异常,这时需要使用catch
块捕获并回滚事务。示例代码如下:
php
try {
$pdo->exec("INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com')");
$pdo->exec("UPDATE users SET name='Jane Doe' WHERE email='john.doe@example.com'");
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollback();
echo "Error: " . $e->getMessage();
}
-
如果所有的 SQL 语句都执行成功,则需要调用 PDO 的
commit()
函数来提交事务。 -
如果在执行 SQL 语句时发生了错误,需要撤销所有的更改,可以使用 PDO 的
rollBack()
函数。在catch
块中调用此函数即可。
示例说明
下面是两个示例说明。
示例1:批量插入数据
假设我们要向数据库中插入一批数据,每次插入一条数据。如果依次插入每条数据,每次操作都要等待数据库响应,速度会很慢。为了提高效率,可以使用事务处理方式,将这一批数据插入到数据库中。如果其中一条数据插入失败,则回滚事务,保证数据库没有发生错误数据。
示例代码如下:
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
try {
$data = [
['name' => 'John', 'email' => 'john@example.com'],
['name' => 'Jane', 'email' => 'jane@example.com'],
['name' => 'Tom', 'email' => 'tom@example.com'],
['name' => 'Jerry', 'email' => 'jerry@example.com'],
];
foreach ($data as $item) {
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => $item['name'], 'email' => $item['email']]);
}
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollback();
echo "Error: " . $e->getMessage();
}
示例2:转账操作
假设我们需要实现一个转账功能。我们的数据库中有两个表:users
表和 wallets
表。users
表中存储用户的个人信息,wallets
表中存储用户的钱包余额。如果用户 A 要向用户 B 转账,则需要先从用户 A 的钱包中扣除相应金额,然后将相应金额转入到用户 B 的钱包中,最后将所有的操作记录在 transactions
表中。
示例代码如下:
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
try {
$userA = 'John Doe';
$userB = 'Jane Doe';
$amount = 100;
// 扣除用户 A 的余额
$stmt = $pdo->prepare("UPDATE wallets SET balance = balance - :amount WHERE user_name = :userA AND balance >= :amount");
$stmt->execute(['amount' => $amount, 'userA' => $userA]);
if ($stmt->rowCount() == 0) {
throw new Exception("Insufficient balance");
}
// 给用户 B 增加余额
$stmt = $pdo->prepare("UPDATE wallets SET balance = balance + :amount WHERE user_name = :userB");
$stmt->execute(['amount' => $amount, 'userB' => $userB]);
// 记录转账操作
$stmt = $pdo->prepare("INSERT INTO transactions (from_user, to_user, amount) VALUES (:userA, :userB, :amount)");
$stmt->execute(['userA' => $userA, 'userB' => $userB, 'amount' => $amount]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
echo "Error: " . $e->getMessage();
}
以上就是使用 PDO 实现事务处理的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP使用pdo实现事务处理操作示例 - Python技术站