PHP文档表示:
如果您以前从未遇到过事务,它们提供4个主要功能:原子性、一致性、隔离性和持久性(ACID)。通俗地说,在事务中进行的任何工作,即使是分阶段进行的,也保证在提交时安全地应用于数据库,并且不受其他连接的干扰。
问题:
这是否意味着我可以同时运行两个独立的php脚本来执行事务而互不干扰?
关于我所说的“干涉”的详细说明:
想象一下,我们有以下的employees
表:
__________________________
| id | name | salary |
|------+--------+----------|
| 1 | ana | 10000 |
|------+--------+----------|
如果我有两个脚本,它们的代码相似/相同,并且它们在完全相同的时间运行: script1.php 和 script2.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();
假设事件序列如下:
- script1.php 选择数据 - script2.php 选择数据 - script1.php 更新数据 - script2.php 更新数据 - script1.php commit() 发生 - script2.php commit() 发生
在这种情况下,Ana 的工资将是多少?
- 它会是11000吗?这是否意味着1个事务将重叠另一个事务,因为信息是在任何提交之前获得的? - 它会是12000吗?这是否意味着无论更新和选择数据的顺序如何,commit()函数都会强制单独发生这些操作?
请随意详细阐述事务和单独的脚本如何相互干扰(或不干扰)。