1

まず、一度INSERTに 2 つのデータを取得したいと考えてTABLEいます。私はそれが不可能であることを知っています。この制限により、REQUESTS(データを挿入するための) 2 つが同時に発生した場合に発生する可能性のある問題を予見しています。

INSERT最初のテーブルにデータを入れる方法はありますか。INSERTデータの間違ったリンクを避けるためにリレーショナル データを入力しているため、最初は誰もデータを取得できませんでしTABLEた (前述の関数を使用して最後に挿入された ID を取得しているために発生する可能性があります) mysqli_insert_id();


                  <strong>更新

:イラスト(擬似コード)
            (私の問題が明確に対処されていないため、例が追加されています)


REQUEST-1 :

//ClientRequest-1
1. INSERT data in table-A
2. GET INSERT-ID
3. INSERT data in table-B

REQUEST-2 :

//ClientRequest-2
1. INSERT data in table-A
2. GET INSERT-ID
3. INSERT data in table-B

チャレンジ

両方のリクエストが次の順序 (マルチスレッド リクエスト)でエラー (前提条件) なしで並列処理されるとどうなるでしょうか。

01. Point # 1 of Request-1

02. Point # 1 of Request-2
03. Point # 2 of Request-2
04. Point # 3 of Request-2

05. Point # 2 of Request-1
06. Point # 3 of Request-1

問題は:

When Points 02,03,04 get executed, will the insert_id get affected for Request-1

それは正しい方法ですか、それとも他の方法ですか?

4

1 に答える 1

2

少し混乱しています。すべての DML 操作 (挿入、更新、削除) は、テーブルに対して暗黙的な行レベルまたはテーブル レベルのロックを保持するため、処理がマルチスレッドで発生した場合でも、前の DML 操作によってロックが解放されない限り、別の DML は成功しません (その場合は INSERT です)。

信頼性を高めるために、DML コード ブロックをブロック内にTRANSACTION明示的に配置して、操作の原子性を確保することを検討できます。

于 2015-11-09T12:30:06.493 に答える