美文网首页小蒋同学
PHP 中 PDO 的 MYSQL 事务处理实例

PHP 中 PDO 的 MYSQL 事务处理实例

作者: 小蒋同学v | 来源:发表于2019-11-16 19:12 被阅读0次

    事务处理

    事务 (transaction) 是由查询和/或更新语句的序列组成。用 begin、start transaction 开始事务,rollback 回滚事务,commit 提交事务。

    在开始事务后,可以有若干个 SQL 查询或更新语句,每个 SQL 递交执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。

    事务一旦回滚,数据库则保持开始事务前状态。就好象一个被编辑的文件不存盘退出,自然还是保持文件原来的样子。

    所以,事务可被视为原子操作,事务中的 SQL,要么全部执行,要不一句都不执行。

    如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动,一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。

    Tips: MySQL只有 InnoDB 驱动支持事务处理,默认 MyIsAM 驱动不支持。

    代码示例

    连接数据库:

    <?php
    try {
        // 数据库 PDO 连接
        $pdo = new \PDO('mysql:host=localhost;dbname=mydb', 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
        // 开启异常处理
        $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
    } catch (\PDOException $e) {
        echo "数据库连接失败:".$e->getMessage();
        exit;
    }
    

    事务处理:

    在下面例子中,假设为新员工创建一组条目,分配一个为 23 的 ID。除了登记资料,还需要记录工资。

    <?php
    try {
        // 开启事务处理
        $pdo->beginTransaction();
        // 执行 SQL
        $sql1 = $pdo->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
        if (!$sql1) {
            // 抛出异常
            throw new \PDOException("登记资料失败");
        }
        $sql2 = $pdo->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
        if (!$sql2) {
            // 抛出异常
            throw new \PDOException("记录工资失败");
        }
        // 没有错误则提交事务
        $pdo->commit();
    } catch (\PDOException $e) {
        // 遇到错误则回滚事务
        $pdo->rollBack();
        echo "Failed: " . $e->getMessage();
    }
    

    相关文章

      网友评论

        本文标题:PHP 中 PDO 的 MYSQL 事务处理实例

        本文链接:https://www.haomeiwen.com/subject/rdtuictx.html