PHP使用pdo实现事务处理操作示例

下面是详细讲解“PHP使用pdo实现事务处理操作示例”的完整攻略。

什么是PDO?

PDO,全称 PHP Data Objects,是PHP 5.1 引入的一组数据库操作 API,它提供了一个面向对象的入口,支持多种数据库的操作,如 MySQL、SQLite、Oracle 等,提供了一致的接口,可以让我们更加方便地操作不同种类的关系数据库。

什么是事务处理?

事务处理是指,在同一时间内,对关系数据库进行某一项或多项操作的集合,这些操作被看作一个单独的工作单位,并且要么全部成功,要么全部失败。

PDO 实现事务处理的步骤

  1. 首先需要连接到数据库,可以使用PDO构造函数来完成。示例代码如下:

php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$pdo = new PDO($dsn, $username, $password);

  1. 接下来设置 PDO 的错误模式,可以将错误模式设置为 PDO::ERRMODE_EXCEPTION,这样在发生错误时会抛出异常。示例代码如下:

php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  1. 开始事务,可以使用 PDO 的 beginTransaction() 函数。示例代码如下:

php
$pdo->beginTransaction();

  1. 执行 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();
}

  1. 如果所有的 SQL 语句都执行成功,则需要调用 PDO 的 commit() 函数来提交事务。

  2. 如果在执行 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技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • SQL Server SQL高级查询语句小结

    SQL Server SQL高级查询语句小结 1. 联合查询 联合查询(UNION)是将两个或多个 SELECT 语句的结果组合成一个结果集的操作。下面是一个简单的联合查询示例,将两个表的数据合并在一起: SELECT name FROM table1 UNION SELECT name FROM table2 2. 子查询 子查询是一个 SELECT 语句…

    database 2023年5月21日
    00
  • MySQL数据类型和常用字段属性总结

    MySQL数据类型和常用字段属性总结 MySQL是目前使用最广泛的关系型数据库之一,不同于其他类型数据库的是,MySQL具有非常丰富的数据类型和字段属性。 数据类型 整型 MySQL定义了5种不同长度的整型,分别为:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。这些整型可以用来存储整数值,具体范围和存储大小如下所示: 类型 存储…

    database 2023年5月22日
    00
  • DBMS中分类和聚类的区别

    DBMS中分类(classification)和聚类(clustering)是两个非常常见的数据挖掘(data mining)技术,主要应用于无监督学习(unsupervised learning)场景中。虽然这两者在表面上看起来非常相似,但它们在实现方法和应用场景上存在一些区别。 分类(classification) 分类是一种基于预先定义好的类别(cat…

    database 2023年3月27日
    00
  • 解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql

    我们来详细讲解如何在阿里云Ubuntu 12.04服务器环境下配置Apache、PHP、PHPmyadmin和MySQL。 步骤一:更新系统并安装必要软件 在开始之前,我们需要先将系统更新到最新状态。可以通过以下命令来进行操作: sudo apt-get update sudo apt-get upgrade 更新过程可能需要一些时间,耐心等待即可。更新完成…

    database 2023年5月22日
    00
  • 如何自动化部署项目?折腾服务器之旅~

    非常感谢您的提问,如何自动化部署项目确实是一个比较有挑战性的问题,但是通过一些工具和技巧,我们可以轻松实现自动化部署,提高开发效率和稳定性。我会在下面的资源列表中,分享一些比较优秀的资源给大家,供大家参考。 如何自动化部署项目?折腾服务器之旅~ 为什么要自动化部署? 自动化部署的好处是非常明显的,主要体现在以下几个方面: 提高开发效率:自动化部署可以极大地缩…

    database 2023年5月22日
    00
  • MySQL 数据库定时备份的几种方式(全面)

    下面我来为您详细讲解“MySQL 数据库定时备份的几种方式(全面)”的完整攻略。本文将介绍 MySQL 数据库定时备份的几种不同的方式,以及这些方式的优缺点和使用方法。 一、使用系统定时任务 1.1 cron Cron 是 Linux 系统自带的一个计划任务程序,可以用于执行定时任务。我们可以使用 crontab 命令设置定时任务,例如,以下命令表示在每天凌…

    database 2023年5月22日
    00
  • MySQL中数据库优化的常见sql语句总结

    MySQL是一款开源的关系型数据库,在使用MySQL时,我们需要考虑到数据库的性能问题,尤其是在面对大量数据时,要进行一定的优化才能保证数据库的稳定性和高效运行。以下是常见的MySQL数据库优化SQL语句: 1.优化查询语句 1.1 对查询数据进行限制 SELECT * FROM TableName LIMIT 10000; 查询大量数据往往会对系统造成不必…

    database 2023年5月19日
    00
  • java 执行redis的部分方法

    @Autowired private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTe…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部