【问题标题】:Get last_insert_id with singleton pattern使用单例模式获取 last_insert_id
【发布时间】:2013-04-22 10:08:43
【问题描述】:

在数据库连接类上使用单例模式时,我想知道一件事。

据我了解,单例模式会阻止创建超过 1 个使用该模式的给定类的对象。

假设我需要我刚刚插入的行中的 id,我通过 mysqli::$insert_id 获得。 如果连接对象的另一种用法同时用于插入一行,这是否会导致返回与预期不同的 id 的机会,或者肯定总是返回正确的 id?

对于新手的问题,我很抱歉,我只是想知道在多用户应用程序中,以这种方式获取 id 的可能性是否很小。

提前致谢。

【问题讨论】:

标签: php oop singleton


【解决方案1】:

从 MySQL 开始:

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

生成的 ID 保存在服务器上的 每个连接的基础。这意味着返回的值 给定客户端的函数是生成的第一个 AUTO_INCREMENT 值 对于影响 AUTO_INCREMENT 列的最新语句 客户。此值不会受到其他客户端的影响,即使它们 生成自己的 AUTO_INCREMENT 值。这种行为确保 每个客户端都可以检索自己的 ID 而无需担心 其他客户端的活动,并且不需要锁或 交易。


让我们进行一些测试:

<?php
header('Content-Type: text/plain');

$con1 = new mysqli('localhost', 'root', '1', 'new_schema');
$con2 = new mysqli('localhost', 'root', '1', 'new_schema');

$sql = 'DROP TABLE IF EXISTS `x`';

$con1->query($sql);

$sql = <<<SQL
CREATE TABLE `x`(
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `value` VARCHAR(20)
)ENGINE=InnoDB;
SQL;

$con1->query($sql);

$sql = <<<SQL
INSERT INTO `x` (`id`, `value`)
VALUES (NULL, NULL);
SQL;

$con1->query($sql);
$con2->query($sql);

echo 'con1 == con2 is ',  $con1 == $con2  ? 'true' : 'false', PHP_EOL;
echo 'con1 === con2 is ', $con1 === $con2 ? 'true' : 'false', PHP_EOL;

echo '1: ', $con1->insert_id, PHP_EOL;
echo '2: ', $con2->insert_id, PHP_EOL;

$con1->close();
$con2->close();
?>

演出:

con1 == con2 is true
con1 === con2 is false
1: 1
2: 2

测试科目: PHP 5.4.5, MySQL 5.6.10.

【讨论】:

  • 在我看来,您在这里建立了 2 个连接,它们是不同的,因为它们只共享它们的目的地,但在其他方面是独一无二的。如果 Singleton 确实有效(只需阅读我帖子评论中的 Singleton 模式的链接),它将始终是在不同用户之间共享的同一个连接对象,这可能会导致获取另一个用户的 id,不是吗? ?
  • @Rasmus,它将被不同的对象共享,而不是用户(除非它是persistent)。自己创建一个连接并仔细观察就足够了。有一个类似的solution,我之前发布过。而且,是的,mysqli::insert_ids 依赖于连接且可靠。
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 2020-11-01
  • 2018-11-05
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2023-03-20
  • 2020-10-25
相关资源
最近更新 更多