2

これらのクエリを MySQL 5.6.13 で実行しています。反復可能な読み取り分離レベルを使用しています。表は次のようになります。

ここに画像の説明を入力

セッションAターミナルで、以下のステートメントを発行しました

UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';

セッション B ターミナルで、ACL Cables の値 lead_time を 2 に更新しようとしました。しかし、セッション A からの前の UPDATE コマンドがまだコミットされていないため (そしてセッション A はメーカー テーブルに排他ロックを持っているため)、この更新は待機します。これは理解できます。

しかし、以下のようにセッション B で SELECT ステートメントを実行しようとすると、

SELECT * FROM manufacturer
WHERE mcode = 'ACL';

製造元テーブルを正しくクエリし、行を提供します。これはどのように起こりますか?セッションAはまだ製造元テーブルの排他ロックを保持しているため、テーブルで排他ロックが保持されている場合、他のトランザクションは前のトランザクションがコミットされるまで読み書きできません。

4

2 に答える 2

2

このページの情報の下にあります

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

取引の特徴の範囲

現在のセッションまたは次のトランザクションに対して、トランザクション特性をグローバルに設定できます。

GLOBAL キーワードを使用すると、ステートメントは後続のすべてのセッションにグローバルに適用されます。既存のセッションは影響を受けません。

SESSION キーワードを使用すると、ステートメントは、現在のセッション内で実行される後続のすべてのトランザクションに適用されます。

SESSION または GLOBAL キーワードがない場合、ステートメントは、現在のセッション内で実行される次の (開始されていない) トランザクションに適用されます。

これは考慮されていますか?

反復可能な読み取り

これは InnoDB のデフォルトの分離レベルです。一貫性のある読み取りの場合、READ COMMITTED 分離レベルとは重要な違いがあります。同じトランザクション内のすべての一貫性のある読み取りは、最初の読み取りによって確立されたスナップショットを読み取ります。この規則は、同じトランザクション内でいくつかの単純な (非ロック) SELECT ステートメントを発行する場合、これらの SELECT ステートメントは相互に一貫性があることを意味します。

この記事では、非常によく説明しています。

http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/

InnoDB は実際には行ではなくインデックス エントリをロックすることに注意してください。ステートメントの実行中、 InnoDB は、変更中の行を見つけるためにトラバースするインデックス内のすべてのエントリをロックする必要があります。デッドロックを防ぎ、分離レベルを維持するには、これを行う必要があります。

テーブルは適切にインデックス化されていますか? SHOW ENGINE innodb STATUSを実行して、ロックが保持されていることを確認できますか?

于 2013-11-12T10:48:11.443 に答える