如何在 PHP 中使用 LOCK FOR UPDATE?
作者:互联网
示例:
假设我们有一个名为 accounts
的表,其中包含 id
和 balance
字段。我们想要安全地更新用户的余额。
-
创建数据库连接:
$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 -
开始事务:
$pdo->beginTransaction();
PHP -
锁定要更新的行:
$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 -
处理异常: 在程序中,务必要使用
try-catch
结构来处理可能发生的异常。try { // 上述代码 } catch (Exception $e) { $pdo->rollBack(); // 回滚事务 if something goes wrong echo "Failed: " . $e->getMessage(); }
PHP
注意事项
- 确保在处理并发事务时小心地使用锁定,以避免死锁。
- 使用
LOCK FOR UPDATE
会阻塞其他对相同数据行的写入访问,因此应尽量减少持锁时间。 - 这段代码是一个基本示例,仅用于演示,请根据自己的实际需求进行调整。
标签: 来源: