1

データベース接続クラスでシングルトン パターンを使用するとき、私は何か疑問に思っていました。

私が理解しているように、シングルトンパターンは、パターンを使用する特定のクラスの複数のオブジェクトの作成を防ぎます。

を介して取得した、挿入したばかりの行のIDが必要だとしましょうmysqli::$insert_id。同時に行を挿入するために接続オブジェクトの別の使用法が使用された場合、予想とは異なる ID が返される可能性がありますか?それとも常に正しい ID を返すことが確実ですか?

初心者の質問で申し訳ありませんが、マルチユーザー アプリケーションで、この方法で ID を取得すると一貫性がなくなる可能性がわずかにあるのではないかと考えていました。

前もって感謝します。

4

1 に答える 1

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.

于 2013-04-22T10:13:10.267 に答える