2017-10-25 1 views
0

サイトで多くのトラフィックを収集するプロジェクトで作業しているので、ユーザーが投稿を作成すると、別のテーブルへの挿入のためにすぐに。多くのトラフィックがあるときにテーブル内の最後に挿入されたIDが競合する可能性があります

私の質問は、サイトにトラフィックが多すぎると、ユーザー1が最初に投稿を挿入して低速ネットワーク上にあった場合、ほぼ同時に、しかしuser1の後に、user2は投稿を挿入し、より高速なネットワークにいたのですか?これが起こると、user2の投稿は最後に挿入された投稿になり、user1は最後に挿入された投稿IDとしてuser2の投稿IDを照会することができます。

これを説明する最良の方法はわかりませんが、誰かが理解して助けてくれることを願っています。

<?php 
    $sql = $db_connect->prepare("insert into post(userid,postnum,posttext)values(?,?,?)"); 
    $sql->bind_param("sss",$id,$postnum,$post); 
    $sql->execute(); 
    $post_id = $sql->insert_id; 
?> 
+1

https://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-正しい – Mat

+0

https://www.w3schools.com/php/php_mysql_insert_lastid.asp 最後のinsert id tie to connection – Deno

答えて

1

自分のIDを自分で生成する代わりに、自分のIDにオートインクリメントフィールドを使用します。 Dbは同時リクエストの数に関係なく一意にするよう注意します。

+0

私は彼がinsert_idを取得できるので、彼は自動インクリメントされた主キーIDを使用していると思います。 –

1

私はそれが完全な要求がサーバーに到達する順序にある​​と思います。 MySQLはそれに応じて要求をキューに入れます。

リクエストがまったく同じ時刻(偶然)の場合、このシナリオでは挿入の順序は保証されません。

テーブルにautoincreamed idsを使用できます。あなたが挿入した後、あなたの参照のために最後のmysql_inserted_idをフェッチすることができます。

<?php 
    $sql = $db_connect->prepare("insert into post(userid,postnum,posttext)values(?,?,?)"); 
    $sql->bind_param("sss",$id,$postnum,$post); 
    $sql->execute(); 
    $post_id = $db_connect->lastInsertId(); 
?> 

あなたはConcurrent insert with MySQLをチェックアウトしたいかもしれないとhttps://dev.mysql.com/doc/refman/5.7/en/concurrent-inserts.html

関連する問題