-2

mysqlデータベースに登録手順があり、次のように機能します。

INSERT INTO `tblusers` (`uname`, `upwd`, `umail`) VALUES (RU_UNAME, RU_UPWD, RU_UMAIL);
select LAST_INSERT_ID() into @newuserid;

-- then use the @newuserid to make some work on other tables.

データベースが他のテーブルに多くの挿入を持っているということで、特に間違ったIDを取得するのではないかと思っていました。次に、ユーザーの挿入と最後に挿入されたIDの取得の間に挿入された別のテーブルのIDを取得する可能性があります。

失敗する可能性はありますか?

4

2 に答える 2

1

一言で言えば、いいえ。データベースへのさまざまな接続は、独自の個別のを維持しますLAST_INSERT_ID。したがって、レコードをに挿入する他のクライアントtblusersは、に影響を与えませんLAST_INSERT_ID

ドキュメントから:

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

ドキュメントは一読する価値があります。それは非常に詳細に物事を綴ります。

于 2013-03-23T11:54:47.377 に答える
0

MySQLはロックシステムを使用します。これにより、2つのプロセス(スクリプトへの2つの呼び出し)が同じ行を変更することはできません。したがって、テーブルがクラッシュすることはありません*が、MySQLが妥当な時間内にリクエストの数を処理できず、リクエストが待機する可能性があります。クエリは常に可能な限り高速になるように最適化する必要があります。

したがって、最後に挿入されたIDは失敗しません。

于 2013-03-23T11:56:20.410 に答える