2016-04-29 9 views
2

私は、phpとmysqlを使ってイベントのために歌った絶対最大人数を制限するアプリケーションを開発中です。PHP MySQLのデータベースとの最大同時実行数

まず、データベースに照会して、すでに署名されているユーザー数を確認します。

まだ場所が残っている場合は、新しい行が挿入され、そうでない場合はエラーがユーザーに返されます。

パラレルリクエストでサインアップする操作を中断する最善の方法は何ですか?セイ:

  • ユーザー1つのクエリのデータベース、一つの場所があり、クエリ、中
  • ユーザー2つのジャンプを残し、
  • ユーザー1つのサインアップ
  • ユーザー2つのサインアップ
を左も一つの場所を見て

私は1人のユーザーが絶対最大値以上になります。私はトランザクションやロックについて読んできましたが、この状況で何を使うべきか分かりません。

挿入直後に選択してコミットする前にトランザクションを開始すれば十分ですか?

答えて

0

あなたは、トランザクションの分離レベルに見てみたい:

単離は、通常、1つの操作によって行われた変更は、他には見えになったときにどのように/定義するプロパティとしてデータベースレベルで定義されています。

4つの分離レベルがあります。これは最高の分離レベルです

Serializableを:彼らはあなたが使用しているデータベースに依存してもよいが、彼らはこれらの可能性があります。

ロックベースの同時実行制御DBMSの実装では、シリアル化機能では、トランザクションの終了時に読み書きロック(選択したデータで取得)を解放する必要があります。また、SELECTクエリがWHERE句を使用するときに、特にファントム読み取り現象(下記参照)を避けるために、レンジロックを取得する必要があります。

非ロックベースの同時実行制御を使用する場合、ロックは取得されません。ただし、複数の同時トランザクション間で書き込み競合が検出された場合は、そのうちの1つだけがコミットできます。このトピックの詳細については、「スナップショットの隔離」を参照してください。

反復は、ロックベースの並行性制御DBMSの実装が読み取られ、トランザクションが終了するまで(選択されたデータに取得した)ロックを書き込み続ける、この分離レベルで

を読み出します。ただし、レンジロックは管理されていないため、ファントムの読み取りが行われる可能性があります。

読むには、ロックベースの同時実行制御のDBMSの実装は、トランザクションが終了するまで(選択したデータに買収)のロックを書きますが、ロックを読み続けるとすぐに解放され、この分離レベルでは

を犯しSELECT操作が実行されます(以下で説明するように、この繰り返しレベルでは反復不可能な読み取り現象が発生する可能性があります)。前のレベルと同様に、レンジロックは管理されません。

単純な言葉で言うと、読み込みコミットは、読み込まれたデータが読み込まれた時点でコミットされることを保証する分離レベルです。これは単に、読者がコミットされていない中間の「汚れた」読書を見るのを制限するだけです。それはトランザクションが読み取りを再発行する場合、同じデータを見つけることを約束するものではありません。データは読み込まれた後に自由に変更できます。

これは最低の分離レベルである

コミットされていない読みます。このレベルでは、ダーティー読み取りが許可されているため、あるトランザクションで他のトランザクションによって行われたコミットされていない変更が表示されることがあります。

より高い独立性レベルでは低いレベルで禁止されるアクションが許可されないため、DBMSは要求された分離レベルよりも高い分離レベルでトランザクションを実行できます。 「Read Committed」トランザクションは、実際には「Repeatable read」分離レベルで実行することができます。

あなたはSerializableを調べる必要があります。出典:Wikipedia(詳細はこちら:https://en.wikipedia.org/wiki/Isolation_(database_systems)

関連する問題