The PHP 文档 http://php.net/manual/en/pdo.transactions.php says:
如果您以前从未遇到过交易,他们提供 4 种主要的交易方式
特点:原子性、一致性、隔离性和持久性(ACID)。在
通俗地说,就是在交易中进行的任何工作,即使它是
分阶段进行,保证应用到数据库
安全地,并且不受其他连接的干扰,当它是
坚定的。
问题:
这是否意味着我可以让两个单独的 php 脚本同时运行事务而不会相互干扰?
详细说明我的意思 "干扰":
假设我们有以下内容employees
table:
__________________________
| id | name | salary |
|------+--------+----------|
| 1 | ana | 10000 |
|------+--------+----------|
如果我有两个具有相似/相同代码的脚本并且它们在完全相同的时间运行:
脚本1.php and 脚本2.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();
并假设事件顺序如下:
-
脚本1.php选择数据
-
脚本2.php选择数据
-
脚本1.php更新数据
-
脚本2.php更新数据
-
脚本1.phpcommit() 发生
-
脚本2.phpcommit() 发生
在这种情况下,ana 的工资是多少?
请随意详细说明事务和单独的脚本如何相互干扰(或不干扰)。
您不会在 php 文档中找到答案,因为这与 php 或 pdo 无关。
mysql中的Innodb表引擎提供了4种所谓的隔离级别 http://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html符合sql标准。隔离级别与阻塞/非阻塞读取相结合将决定上述示例的结果。您需要了解各种隔离级别的含义,并根据您的需求选择合适的隔离级别。
总结一下:如果您使用可串行化隔离级别并关闭自动提交,则结果将为 12000。在所有其他隔离级别和可串行化且启用自动提交的情况下,结果将为 11000。如果您开始使用锁定读取,则结果可能为所有隔离级别下均为 12000。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)