2012-12-02 6 views
7

同時実行制御とトランザクション分離レベルの違いは何ですか?"反復可能な読み取り"とオプティミスティック

私はそれぞれのことをはっきりと理解していますが、私はお互いに関連するいくつかの問題があります。具体的には、それらの機能にいくつかの重複があり、どちらを使うべきかわかりません。または両方を一緒に使用する必要がありますか?

また、反復可能な読み取りによる悲観的なロックとはどういう意味ですか?反復可能な読み込みは、編集するすべての値がロックされていることを意味していますか?なぜ悲観的なロックが必要なのでしょうか?

答えて

4

同時実行制御には2つのモデルがあり、SQL実装によって混合されることがあるため、問題が発生します。 2PL(2フェーズロック)のよう

  1. ロック、MVCC(マルチバージョン並行処理制御)のよう
  2. バージョン、

悲観読み出される行がロックされていることを意味します。楽観的な意味は、読み込まれた行はロックされていないということです。

繰り返し読み取りの古典的な2PL実装は、常に悲観的です。 Repeatable Readのマルチバージョン実装は楽観的です。 SELECTステートメントで読み取られた行をロックせず、SELECTで読み取られた行を他のトランザクションが変更できるようにします。このような変更は、SELECTを実行したトランザクションがコミットするまで表示されません。

+0

他のトランザクションが変更およびコミットすると、その変更はすぐにSELECTを実行したトランザクションに表示されます。繰り返し読み取りはどのように達成されますか? – Sunnyday

+0

セッションがデフォルトでは 'READ COMMITTED'ですが、通常はREPEATABLE READに設定できます。たとえば、HSQLDBの 'SET TRANSACTION REPEATABLE READ'と同じです。 – fredt

5

同時実行制御は、同時接続から発生する問題を処理するすべてのメカニズムの総称です。

トランザクション分離レベルは、MySQLが並行性制御を実装するメカニズムです。

は、MySQLが悲観的ロックなしREPEATABLE READを実装する方法に関するドキュメントのためのConsistent Nonlocking Readsを参照してください:

一貫した読み取りはそれがアクセスするテーブル上のすべてのロックを設定しませんので、他のセッションが同じでそれらのテーブルを変更するのは自由です一貫性のある読み取りがテーブル上で実行される時間。

デフォルトのREPEATABLE READ分離レベルで実行されているとします。一貫性のある読み取り(つまり、通常のSELECTステートメント)を発行すると、InnoDBはクエリにデータベースを参照する時間ポイントをトランザクションに与えます。タイムポイントが割り当てられた後に別のトランザクションが行を削除してコミットした場合、その行は削除されているとは見なされません。挿入と更新は同様に扱われます。