【发布时间】:2016-09-30 03:21:09
【问题描述】:
如果您以前从未遇到过交易,他们提供 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 吗?那么这是否意味着一个事务将与另一个事务重叠,因为信息是在任一提交发生之前获得的?
-
会是 12000 吗?这是否意味着无论数据更新和选择的顺序如何,
commit()函数都会强制这些单独发生?
请随意详细说明事务和单独的脚本如何相互干扰(或不干扰)。
【问题讨论】:
-
我很确定其中一个脚本会弹出
SQLSTATE[23000]: Integrity constraint violation错误。问题是如果它们同时运行,是哪一个。
标签: php mysql pdo transactions