了解 pdo mysql 事务
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();
并假设事件的顺序如下:
-
脚本 1.php 选择数据
-
脚本 2.php 选择数据
-
脚本 1.php更新数据
-
脚本 2.php 更新数据
-
script1.php commit() 发生
-
script2.php commit() 发生
在这种情况下,ana的薪水会是多少?
-
会是11000吗?这是否意味着 1 个事务将与其他事务重叠,因为信息是在任一提交发生之前获得的?
-
会是12000年吗?那么,这是否意味着无论数据的更新和选择顺序如何,函数都会强制这些情况单独发生?
commit()
请随时尽可能多地详细说明事务和单独的脚本如何相互干扰(或不干扰)。