当前位置:首页 > PHP

php 实现事务

2026-04-03 16:25:05PHP

PHP 实现事务的方法

在 PHP 中,事务通常用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID)。以下是几种常见的方法:

使用 PDO 实现事务

PDO(PHP Data Objects)是 PHP 的一个数据库抽象层,支持事务操作。以下是一个使用 PDO 实现事务的示例:

php 实现事务

try {
    $pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $pdo->beginTransaction();

    $stmt1 = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $stmt1->execute(["John Doe", "john@example.com"]);

    $stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
    $stmt2->execute([100, 1]);

    $pdo->commit();
    echo "Transaction completed successfully.";
} catch (PDOException $e) {
    $pdo->rollBack();
    echo "Transaction failed: " . $e->getMessage();
}

使用 MySQLi 实现事务

MySQLi 是 PHP 的 MySQL 扩展,也支持事务操作。以下是一个使用 MySQLi 实现事务的示例:

php 实现事务

$mysqli = new mysqli("localhost", "username", "password", "test");

if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}

$mysqli->autocommit(FALSE);

$query1 = "INSERT INTO users (name, email) VALUES ('Jane Doe', 'jane@example.com')";
$query2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = 2";

if ($mysqli->query($query1) && $mysqli->query($query2)) {
    $mysqli->commit();
    echo "Transaction completed successfully.";
} else {
    $mysqli->rollback();
    echo "Transaction failed: " . $mysqli->error;
}

$mysqli->close();

使用 Laravel 的数据库事务

Laravel 提供了简洁的数据库事务 API。以下是 Laravel 中实现事务的示例:

use Illuminate\Support\Facades\DB;

try {
    DB::transaction(function () {
        DB::table('users')->insert([
            'name' => 'Alice',
            'email' => 'alice@example.com'
        ]);

        DB::table('accounts')->where('user_id', 3)->increment('balance', 50);
    });
    echo "Transaction completed successfully.";
} catch (\Exception $e) {
    echo "Transaction failed: " . $e->getMessage();
}

手动控制事务

在某些情况下,可能需要手动控制事务的提交和回滚。以下是手动控制事务的示例:

$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $pdo->beginTransaction();

    $pdo->exec("INSERT INTO orders (product_id, quantity) VALUES (1, 2)");
    $pdo->exec("UPDATE inventory SET quantity = quantity - 2 WHERE product_id = 1");

    if (/* 检查库存是否充足 */) {
        $pdo->commit();
        echo "Order placed successfully.";
    } else {
        $pdo->rollBack();
        echo "Insufficient inventory.";
    }
} catch (PDOException $e) {
    $pdo->rollBack();
    echo "Error: " . $e->getMessage();
}

注意事项

  • 确保数据库引擎支持事务(如 InnoDB)。
  • 在事务中避免长时间运行的操作,以减少锁竞争。
  • 捕获异常并在异常发生时回滚事务。
  • 测试事务的回滚逻辑,确保数据一致性。

标签: 事务php
分享给朋友:

相关文章

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现mvc

php实现mvc

PHP 实现 MVC 架构 MVC(Model-View-Controller)是一种常用的软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller…

php实现des加密

php实现des加密

DES 加密实现方法 在 PHP 中实现 DES 加密可以通过内置的 mcrypt 或 openssl 扩展完成。由于 mcrypt 已在 PHP 7.2 中废弃,推荐使用 openssl 扩展。…