3

私は現在、そこに多くのトランザクションを持つ巨大なデータベースを構築しています。(挿入、更新、選択) MySQL MyISAM で

また、機密テーブルには LOCK TABLE AND UNLOCK TABLE を使用することを検討しています。次の場合はどうなりますか:

ユーザー A には更新プロセス (最初にテーブルをロック) があり、まだプロセス中に、ユーザー B とユーザー C が同じテーブルと行にアクセスしようとしています (更新/選択に関係なく)。

  • B と C は、テーブルがロックされているという SQL エラーをすぐに受け取りますか?
  • MySQL には、エラーを返す前にロック タイムアウトがありますか? ロック タイムアウトがある場合、サーバーでロック タイムアウトを確認するにはどうすればよいですか?
  • テーブルをロックするよりも良い解決策はありますか? ジョブキュー用のテーブルの作成を検討しています。しかし、私はパフォーマンスが本当に悪いと思います。

このテーブルは非常に機密性が高く、これを防止できないと台無しになります

ご回答有難うございます

4

3 に答える 3

3

MyISAMより効率的にスケーリングし、同時実行の問題に対処する場合は、ストレージ エンジンを使用しないでください。InnoDB代わりに選択する主な理由MyISAMは、MyISAMテーブルごとのロック (パフォーマンスのボトルネックになる) を使用し、行レベルでのロックを意味する (マルチバージョン同時実行制御) をInnoDB実装することです。MVCC

またMyISAM、トランザクションをサポートしておらず、テーブルが破損した場合は手動で修復する必要があります。

于 2013-10-11T10:19:50.543 に答える
1

あなたの質問に答えるために - B & C は、タイムアウトが期限切れになるまでブロックされます。現在、MyISAM のタイムアウト設定が見つかりません。InnoDB の mysqld.conf に設定されています。

他の人が言ったように、トランザクションのサポートが必要な場合は、InnoDB の方が優れたエンジンです。

ただし、本当にロックが必要かどうかを検討してください。特に多数の同時ユーザーがいるシステムでは、パフォーマンスに予測できないボトルネックが生じます。テーブル レベルのロックによって恐ろしいデッドロックシナリオが発生することはありませんが、テーブル レベルのロックは、一度に 1 つのプロセスしかテーブルを使用できないことを意味します。各データベース操作に 1 秒かかる場合 (大規模なデータベースでは不合理ではありません)、システムの同時ユーザーが 2 人を超えると、パフォーマンスの低下に気付くでしょう。10 人の同時ユーザーがいると、特に複数のテーブルに参加する必要がある場合に、システムが非常に遅くなることがわかります。

ほとんどの場合、トランザクションははるかに優れたソリューションです。

于 2013-10-11T10:51:01.337 に答える
0

トランザクション サポートで良好なパフォーマンスを得るには、MYISAM の代わりに INNODB を使用することをお勧めします。INNODB は行レベルのロックで動作します。複数のユーザーが同時にテーブルにアクセスして、異なるレコードを変更できます。

INNODB ロックメカニズムについては、こちらをお読みください

ロックの問題についてはこちらをお読みください

于 2013-10-11T10:34:07.810 に答える