在PHP文件说:
如果您以前从未遇到过事务,则它们提供4个主要功能:原子性,一致性,隔离性和持久性(ACID)。用外行的术语来说,事务中执行的任何工作,即使它是分阶段进行的,都可以保证在提交时安全地应用于数据库,并且不受其他连接的干扰。
题:
这是否意味着我可以让两个单独的php脚本同时运行事务,而又彼此不干扰?
通过 “ 干扰 ” 细化我的 意思 :
假设我们有下employees表:
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()函数都会强制这些操作单独发生?
commit()
请随意详细说明事务和单独的脚本如何相互干扰(或不干扰)。
您不会在php文档中找到答案,因为这与php或pdo无关。
mysql中的Innodb表引擎提供了4个所谓的与sql标准一致的隔离级别。隔离级别与阻塞/非阻塞读取一起将确定上述示例的结果。您需要了解各种隔离级别的含义,并根据需要选择合适的隔离级别。
总结一下:如果在自动提交关闭的情况下使用可串行化的隔离级别,则结果将为12000。在所有其他隔离级别和启用自动提交的可串行化的情况下,结果将为11000。如果开始使用锁定读取,则结果可能是在所有隔离级别下为12000。