编程语言
首页 > 编程语言> > 如何在 PHP 中使用 LOCK FOR UPDATE?

如何在 PHP 中使用 LOCK FOR UPDATE?

作者:互联网

示例:

假设我们有一个名为 accounts 的表,其中包含 id 和 balance 字段。我们想要安全地更新用户的余额。

  1. 创建数据库连接:

    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
    $username = 'your_username';
    $password = 'your_password';
    
    try {
        $pdo = new PDO($dsn, $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    

    PHP
  2. 开始事务:

    $pdo->beginTransaction();
    

    PHP
  3. 锁定要更新的行:

    $accountId = 1; // 假设我们要更新 id 为 1 的账户
    $stmt = $pdo->prepare('SELECT * FROM accounts WHERE id = ? LOCK IN SHARE MODE');
    $stmt->execute([$accountId]);
    $account = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($account) {
        // 读取当前余额
        $newBalance = $account['balance'] + 100; // 假设我们要增加 100
        
        // 锁定行以进行更新
        $stmt = $pdo->prepare('SELECT * FROM accounts WHERE id = ? FOR UPDATE');
        $stmt->execute([$accountId]);
    
        // 更新余额
        $updateStmt = $pdo->prepare('UPDATE accounts SET balance = ? WHERE id = ?');
        $updateStmt->execute([$newBalance, $accountId]);
    
        // 提交事务
        $pdo->commit();
        echo "Balance updated successfully!";
    } else {
        echo "Account not found.";
    }
    

    PHP
  4. 处理异常: 在程序中,务必要使用 try-catch 结构来处理可能发生的异常。

    try {
        // 上述代码
    } catch (Exception $e) {
        $pdo->rollBack();  // 回滚事务 if something goes wrong
        echo "Failed: " . $e->getMessage();
    }
    

    PHP

注意事项

标签:
来源: