要避免脏读,您可以使用以下两种方法:
SELECT ... FOR UPDATE 语句:在 MySQL 中,您可以使用 SELECT ... FOR UPDATE 语句来锁定选定的行,直到当前事务结束。这将确保在事务过程中其他事务无法修改这些行。示例如下:
// 开始事务 $pdo->beginTransaction(); try { // 选择要锁定的行 $stmt = $pdo->prepare("SELECT * FROM your_table WHERE condition FOR UPDATE"); $stmt->execute(); // 获取查询结果 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 对数据进行处理(例如更新) foreach ($rows as $row) { // 更新行 $updateStmt = $pdo->prepare("UPDATE your_table SET column = :value WHERE id = :id"); $updateStmt->execute([':value' => $newValue, ':id' => $row['id']]); } // 提交事务 $pdo->commit(); } catch (Exception $e) { // 发生错误时回滚事务 $pdo->rollBack(); throw $e; } PHP 的 PDO 扩展支持四种事务隔离级别,您可以根据需要选择适当的级别。较低级别的隔离级别可能会导致脏读,但较高级别可以避免脏读。以下是四种隔离级别的概述:
要设置隔离级别,请在开始事务之前执行以下代码:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 设置隔离级别 $pdo->setAttribute(PDO::ATTR_TXN_ISOLATION, PDO::ATTR_TXN_SERIALIZABLE); 请注意,较高的隔离级别可能会影响性能。因此,在选择隔离级别时,请根据您的应用程序需求进行权衡。