PHP 文档强调了事务的好处,强调它们确保数据库内原子、一致、隔离和持久操作的能力.
问题:
这是否意味着并发运行事务的单独 PHP 脚本可以不受干扰地运行?
关于干扰的详细说明:
考虑具有以下数据的员工表:
id | name | salary |
---|---|---|
1 | ana | 10000 |
具有相似代码的两个脚本同时执行:
script1.php 和 script2.php:
<code class="php">$conn->beginTransaction(); $stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?"); $stmt->execute(['ana']); $row = $stmt->fetch(PDO::FETCH_ASSOC); $salary = $row['salary']; $salary = $salary + 1000;//increasing salary $stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?"); $stmt->execute(['ana']); $conn->commit();</code>
问题是关于“ana”在不同执行场景下的薪资结果。
答案:
结果取决于隔离级别为 MySQL 中的 InnoDB 表引擎配置。根据 SQL 标准,存在四种隔离级别:
在给定的场景中,使用 SERIALIZABLE 隔离级别并禁用自动提交将导致工资为 12000,因为每个事务都是隔离的并按顺序执行。
但是,使用任何其他隔离级别或启用自动提交的 SERIALIZABLE ,结果将为 11000。这是因为在这些情况下事务可能会重叠,从而存在潜在的干扰。使用锁定读取也会影响结果,可能会导致在所有隔离级别下工资为 12000。
因此,所采用的具体隔离级别和配置设置将决定 PHP 脚本中并发事务之间的干扰或缺乏.
以上是PDO MySQL 中的并发 PHP 事务会互相干扰吗?的详细内容。更多信息请关注PHP中文网其他相关文章!