apache服务器如何处理对数据库的并发请求

时间:2020-01-26 01:38:34

标签: php mysql apache concurrency

我正处于Web应用程序的构建阶段,该应用程序在后端和apache服务器中使用PHP。 在处理对MYSQL数据库的多个请求时,我对并发性有一些疑问。让我们以以下情形为例,因为它是解决我的问题的一种情形。

假设我正在对表进行插入,并且该表使用自动递增字段,并且在PHP脚本端也使用PDO。我有兴趣在PDO :: lastInsertId函数的帮助下从最后插入的记录的自动递增字段获取ID。同样重要的一点是,我遵循以下这种通过手动事务将事务传送到数据库的方式


$conn = new PDO('ibm:SAMPLE', 'db2inst1', 'ibmdb2', array(
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
  // PDO::ERRMODE_EXCEPTION means an SQL error throws an exception
try {
  // Issue these SQL statements in a transaction within a try{} block
  $conn->beginTransaction();

  // One or more SQL statements

  $conn->commit();
}
catch (Exception $e) {
  // If something raised an exception in our transaction block of statements,
  // roll back any work performed in the transaction
  print '<p>Unable to complete transaction!</p>';
  $conn->rollBack();
}

我的问题是:

1。如果在不同的用户访问数据库的同一时间发生了两次插入,那么最后插入返回的ID是否有可能不正确?

2 apache服务器是否为每个请求并使用创建新连接的php脚本的用户创建一个新的数据库连接?如果是这样,未提交的事务在提交之前是否不会反映到数据库中?

1 个答案:

答案 0 :(得分:0)

  1. 简短的回答:这取决于您使用的驱动程序。

长答案:因为其他客户进行了更改,因此没有机会获得错误的价值。

PHP:

根据基础驱动程序,返回最后插入的行的ID或序列对象的最后一个值。例如,PDO_PGSQL要求您为name参数指定序列对象的名称。 https://www.php.net/manual/en/pdo.lastinsertid.php

MySQL:

对于LAST_INSERT_ID(),将在每个连接的基础上在服务器中维护最近生成的ID。其他客户端不会更改它。如果您使用非魔法值(即,非NULL且非0的值)更新另一个AUTO_INCREMENT列,则甚至不会更改。同时使用多个客户端的LAST_INSERT_ID()和AUTO_INCREMENT列是完全有效的。每个客户端将收到该客户端执行的最后一条语句的最后插入的ID。 https://dev.mysql.com/doc/refman/8.0/en/getting-unique-id.html

  1. 是的,Apache + PHP为每个请求创建一个新的连接(花时间研究持久性连接),是的,这就是事务的工作方式:

每次提交时,每个事务都以二进制形式存储在二进制日志中。 https://dev.mysql.com/doc/refman/8.0/en/commit.html有关二进制日志的更多信息:https://dev.mysql.com/doc/refman/8.0/en/binary-log.html