3

テーブル内の破損したデータを取得せずに、sのバッチの後にClauseSELECTで使用できるかどうかを自問しています。複数のユーザーが同時に同じことをしているというシナリオを考えています。このシナリオが可能なJSFアプリケーションを開発します。LAST_INSERT_ID()WHEREINSERT

ハードコードでは、私のaftersはSELECTINSERTのようになります。

preparedstatement.addBatch(
              "INSERT INTO table1(all the FIELDS)"
              + "VALUES(null, ...);"
      );

      preparedstatement.addBatch(
              "INSERT INTO table2(all the FIELDS)"
              + "VALUES(null, LAST_INSERT_ID(), ...);"          
      );


      preparedstatement = connect.prepareStatement(

              "SELECT id FROM table3 WHERE id = LAST_INSERT_ID();"

      );

      preparedstatement.executeBatch();
      resultSet = preparedstatement.executeQuery();

この実装で問題が発生しますか、それとももっと良い方法がありますか?

よろしくお願いします

4

1 に答える 1

1

MySQL のドキュメントを引用して、問題ないはずです。

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

MySQL Last_insert_id

于 2012-11-13T16:32:33.057 に答える