4

ユーザーが入力したデータを収集するテーブルがあります。

次のSQL文を実行したい:

SELECT ステートメント 1

SELECT ステートメント 2

2 つの select ステートメントで読み込んだ UPDATE テーブルの行

ステートメントの間に別のユーザーが新しいデータを入力する可能性を防ぎたいです。

MySQL のマニュアルを読みましたが、最初にテーブルをロックできたようですが、私はトランザクションに精通しており、トランザクションを 3 つのステートメントでラップすることで目的が達成されるかどうかを知りたいと考えています。マニュアルを読んでも、これが機能することを確認するのは非常に難しいことがわかりました(または、私だけかもしれません....)

4

1 に答える 1

2

ここには 2 つの問題の範囲が考えられます。トランザクション (InnoDB などのトランザクションをサポートするエンジンを使用している場合) は、そのうちの 1 つを解決します。

トランザクションは、トランザクションが開始されたときのデータベース状態のスナップショットで実行されているすべてのクエリを保持し、トランザクションが完了すると、すべての変更が適用されます。これにより、クエリでのインターリーブと競合状態が効果的に解決されます。

ただし、ステートメントの間にユーザーが新しいデータを入力するのを防ぎたいと述べました。これが、リクエストを送信するユーザーが現在のデータから開始していることを確認したい状況である場合は、独自のロック メカニズムを実装するか、少なくともリクエスト間のインターリーブが問題を引き起こしているケースをトラップする方法を実装する必要があります。

基本的に、トランザクションは同時リクエストで実行されているクエリでのみ役立ちます。このシナリオが問題になる場合:

  1. User1 がデータを要求する
  2. User2 がデータを要求する
  3. User1 が変更を送信
  4. User2 が変更を送信

User2 が User1 による変更を知らずに変更を送信できた場合、独自のロック システムが必要になります。トランザクションは役に立ちません。これは、各ステップが個別のトランザクション内の個別の Web リクエストである Web 開発のバックグラウンドから来ています。

于 2013-03-17T22:04:36.543 に答える