PDO MySQL 中的并发 PHP 事务会互相干扰吗?

Linda Hamilton
发布: 2024-11-01 04:43:27
原创
375 人浏览过

 Can Concurrent PHP Transactions in PDO MySQL Interfere with Each other?

了解 PDO MySQL 中的事务隔离

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 标准,存在四种隔离级别:

  • READ UNCOMMITTED: 允许读取未提交的数据。并发事务可能会相互干扰。
  • READ COMMITTED: 只允许读取其他事务提交的数据。并发事务通常不会干扰。
  • 可重复读取: 防止其他事务修改当前事务读取的数据。如果并发事务尝试修改相同的数据,它们仍然可能会产生干扰。
  • SERIALIZABLE:确保事务以串行方式执行,防止并发事务之间出现任何干扰。

在给定的场景中,使用 SERIALIZABLE 隔离级别并禁用自动提交将导致工资为 12000,因为每个事务都是隔离的并按顺序执行。

但是,使用任何其他隔离级别或启用自动提交的 SERIALIZABLE ,结果将为 11000。这是因为在这些情况下事务可能会重叠,从而存在潜在的干扰。使用锁定读取也会影响结果,可能会导致在所有隔离级别下工资为 12000。

因此,所采用的具体隔离级别和配置设置将决定 PHP 脚本中并发事务之间的干扰或缺乏.

以上是PDO MySQL 中的并发 PHP 事务会互相干扰吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!