1

私はデータベース内の複数のスレッドを操作するのはかなり新しいです(私のキャリアのほとんどはフロントエンドに費やされてきました)。

今日は、テーブルロックを使用してトランザクションをエミュレートするISAMテーブルを使用してmysqlデータベースに値を格納するために作成した単純なphpアプリをテストしてみました。

手順についてのブログ投稿をここに書きました:

JMeterでのテスト

私の結果から、私の単純なphpアプリは、トランザクションの整合性を維持しているように見えます(csvファイルのデータがデータベースから再抽出したデータと同じであることがわかります)。

CSVファイル:

alのaltcsv blのaltcsv

JMeterテスト実行後の両方のユーザーのデータのクエリ:

alt alt

トランザクションデータの整合性は損なわれていないという私の仮定は正しいですか?

同時実行性をどのようにテストしますか?

4

1 に答える 1

2

InnoDB を使用して、手動でテーブルをロックせずに同じ効果を得てみませんか?

また、何から保護していますか?2 人のユーザー (Bill と Steve) について考えてみましょう。

  1. 請求書のロード レコード 1234
  2. スティーブはレコード 1234 を読み込みます
  3. スティーブはレコード 1234 を変更して送信します
  4. Bill は少し待ってから、古いレコード 1234 を更新して送信します。これらの変更により、Bill's が無効になります。

テーブル ロックは、ネイティブの MyISAM テーブル ロックよりも高いデータ整合性を提供しません。MyISAM は、データの破損を防ぐ必要がある場合、テーブル ファイルをネイティブにロックします。

実際、MyISAM ではなく InnoDB を使用する理由は、テーブル ロックの代わりに行ロックを行うためです。取引にも対応しています。異なるレコードへの複数の更新は相互にブロックされず、複数のレコードへの複雑な更新はトランザクションが完了するまでブロックされます。

アプリケーションで、同じレコードに対する 2 つの更新が同時に発生する可能性を考慮する必要があります。可能性が高い場合、テーブル/行のロックは 2 番目の更新をブロックせず、最初の更新が完了するまで延期するだけです。

編集

私の記憶では、MyISAM は挿入に対して特別な動作をします。テーブルの最後に追加するだけなので、挿入のためにテーブルをロックする必要はまったくありません。これは、一意のインデックスまたは非自動インクリメント主キーを持つテーブルには当てはまらない場合があります。

于 2009-04-30T02:51:54.170 に答える