在数据库连接类上使用单例模式时,我想知道一件事。
据我所知,单例模式可以防止创建使用该模式的给定类的超过1个对象。
让我们说我需要从我刚插入的一行中的id,我通过mysqli::$insert_id
获得。
如果使用连接对象的另一次使用同时插入一行,可能会导致返回一个不同的id然后返回正确的id?或者是否肯定会返回正确的id?
很抱歉新手问题,我一直想知道多用户应用程序是否有一个很小的机会以这种方式获取id可能不一致。
提前致谢。
答案 0 :(得分:3)
从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
。