ロック機構

13.ロック機構

リソース共有によって引き起こされる同時実行性を解決する問題

13.1悲観的ロック

常に最悪のケースを想定します。データを取得するたびに、他の人がデータを変更すると思うので、データを取得するたびにロックして、データを取得したい他の人がロックを取得するまでブロックするようにします。 (共有リソース一度に1つのスレッドでのみ使用され、他のスレッドはブロックされ、リソースは使い果たされた後に他のスレッドに転送されます)。このようなロックメカニズムの多くは、行ロック、テーブルロックなど、読み取りロック、書き込みロックなどの従来のリレーショナルデータベースで使用されており、これらはすべて操作前にロックされます。

13.2楽観的ロック

常に最善の状況を想定します。データを取得するたびに、他の人がデータを変更しないと思うので、ロックされませんが、更新するときにこの期間中に他の人がデータ更新しかどうか判断されます。バージョン。番号メカニズムとCASアルゴリズムの実装。楽観的ロックは、読み取り量が多く書き込み量が少ないアプリケーションに適しており、スループットを向上させることができます

13.2.1。楽観的ロックのデメリット

ABA問題

変数Vが最初に読み取られたときのAの値であり、割り当てる準備ができたときにまだAの値であることが確認された場合、その値が他のスレッドによって変更されていないことを示すことができますか?この間に値が別の値に変更されてからAに戻される可能性があるため、明らかに不可能です。CAS操作では、変更されたことがないと誤って信じてしまいます。この問題は CAS運用の「ABA」問題と呼ばれます

CASをスピンします(つまり、失敗した場合は、成功するまでループで実行し続けます)。長時間失敗した場合、CPUに非常に大きな実行コストがかかります。

13.2.2、楽観的ロックの実現

バージョン番号メカニズム

通常、データのバージョン番号バージョンフィールドはデータが変更された回数を示すデータテーブルに追加されます。データが変更されると、バージョン値が1つ増加します。スレッドAがデータ値を更新する場合、データの読み取り中にバージョン値も読み取ります。更新を送信するときに、今読み取ったバージョン値が現在のデータベースのバージョン値と等しい場合は更新します。それ以外の場合は更新します。更新が成功するまで、更新操作を再試行してください。更新された「楽観的ロック戦略」を実行するには、送信されたバージョンがレコードの現在のバージョンよりも大きい必要があります

CASアルゴリズム

つまり、コンペアアンドスワップ(コンペアアンドスワップ)は、よく知られているロックフリーアルゴリズムです。ロックフリープログラミング、つまり、ロックを使用せずに複数のスレッド間で変数の同期を実現する、つまり、スレッドをブロックせずに変数の同期を実現するため、ノンブロッキング同期(ノンブロッキング同期)とも呼ばれます。CASアルゴリズムには3つのオペランドが含まれます

  • メモリ値Vの読み取りと書き込みが必要
  • 比較する値A
  • 書き込まれる新しい値B

Vの値がAに等しい場合にのみ、CASはVの値を新しい値Bでアトミックに更新します。それ以外の場合、CASは操作を実行しません(比較と置換はアトミック操作です)。通常の状況では、これはスピン操作、つまり一定の再試行です。

CASは単一の共有変数に対してのみ有効です。操作に複数の共有変数が含まれる場合、CASは無効です。

ロックの分類

操作タイプ:

  • 読み取りロック(共有ロック):同じデータに対して、複数の読み取り操作を同時に実行できますが、書き込み操作は実行できません
  • 書き込みロック(相互排除ロック):現在の書き込み操作が完了していない場合、他の操作(読み取り操作、書き込み操作)は実行できません。

動作範囲:

  • テーブルロック:MyISAMなど、テーブル全体を一度にロックします
    • 利点:オーバーヘッドが低くロックが速い
    • 短所:ロックの範囲が広く、競合が発生しやすくなります。
  • 行ロック:一度に1行のデータをロックします
  • ページロック

ロック操作

--加锁
lock table  mytable read/write; 

--查看加锁的表
show open tables;

--会话:session: 每一个访问数据的dos命令行、数据库客户端工具


----------【加读锁】
--会话0
--对A表加了【读锁】,那么会话0可以对A表进行读,但是不可以写
--会话0不可以对其他表进行		读和写

--其他会话
---可以对A表进行读操作,
---写操作会等待A表的读锁释放




----------【加写锁】

--会话0给表A加写锁,那么会话0可以对A表进行【任何操作】,但是【不能】对其他表操作

--其他会话:
 ---可以对会话0加锁的表进行增删改查,但是要等会话0释放锁

ロックされているテーブルを確認します。開いているテーブルを表示します。1はロックを表します。

テーブルロックの重大度を分析します。「table%」のようなhoswステータス。

table_locks_immediate:取得できるロックの数

Table_locks_waited:待機するロックの数を示します

テーブルロックは、テーブルのロック解除によってロック解除されます

行ロックはトランザクションによってロック解除され、ロールバックをコミットします

行ロックに関する注意

-[インデックス]がない場合、行ロックは[テーブルロック]に変換されます。

インデックスクラスの型変換が発生すると、インデックスが無効になります。したがって、ロックが変換された後、実行は失敗します

行ロック分析

'%innodb_row_lock%'のようなステータスを表示します。

---- Innodb_row_lock_current_waits:現在待機しているロックの数
| Innodb_row_lock_time:合計待機時間。システムの起動から現在までの合計待機時間
| Innodb_row_lock_time_avg:平均待機市場。システムの起動から現在までの平均待機時間
| Innodb_row_lock_time_max最大待機時間。システムの起動から現在までの最大待機時間

| Innodb_row_lock_waits:待機数

おすすめ

転載: blog.csdn.net/qq_40738693/article/details/113929521