2011-05-08 16 views
11

私はしばらくこれについて熟考してきました。MySQLとPDO:理論的にPDO :: lastInsertIdが失敗する可能性がありますか?

膨大な量のWebアプリケーションを考えてみましょう。何百万ものSQLクエリが毎秒実行されています。

私は私のコードを実行します。

$q = $db->prepare('INSERT INTO Table 
       (First,Second,Third,Fourth) 
      VALUES (?,?,?,?)'); 
$q->execute(array($first,$second,$third,$fourth)); 

は次に直後、私は自動車を取得したいが、この最後のクエリのIDをインクリメント:

$id = $db->lastInsertId(); 

はすなわちフェッチ、それは可能でlastInsertIdが失敗するためです実行されたSQLの挿入クエリのID と2つのコードブロックの間?

セカンダリ:

それはこの可能リークをプラグインするための最良の方法であるもの、失敗する可能性がありますか?

確かに、データベースから適切なIDを取得するために別のSQLクエリを作成する方が安全ですか?

答えて

18

PDO実装が実際に何か骨折していない場合は、常に安全です。以下は、last_insert_idのMySQL情報です。

生成されたIDは、接続ごとにサーバーで管理されています。つまり、関数が指定したクライアントに返す値は、そのクライアントがAUTO_INCREMENT列に影響を与える最新の文に対して生成された最初のAUTO_INCREMENT値です。この値は、たとえ自身のAUTO_INCREMENT値を生成したとしても、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、ロックやトランザクションを必要とせずに、他のクライアントのアクティビティを意識することなく、独自のIDを取得できます。

+0

よろしくお願いします。ありがとう! – Mattis

4

いいえlastInsertIdは接続ごとであり、サーバへのリクエストを必要としません。mysqlは常に応答パケットでそれを返します。

したがって、executeメソッドが例外をスローしない場合、lastInsertIdに正しい値が設定されていることが保証されます。

何らかの理由(たとえば無効な構文)でクエリが失敗しない限り、同じ接続の前のIDからの挿入IDが得られる場合を除き、他のものの挿入IDはあなたに与えられません。しかし、他の誰かではない。

+1

恐ろしいマーク、私は安全だと感じる:) – Mattis

関連する問題