Mysqlの悲観的なロックがどのように使われているかをまとめます

3206 ワード

この2,3日、高同時電子商取引サイトに関するソリューションをたくさん見ました.本稿では,データサーバとのインタラクションを実現する部分を主に考慮する.楽観ロックには主に2つの解決方法があり,versionとタイムスタンプは,他の資料から容易に理解できる.しかし、悲観的なロックに関する具体的な解決策は、実現の程度に達していないことを理解してきた.以下は自分の経験を分かち合って、多くの知識の材料は他のブログの大物たちの無私な分かち合いから来ます~
一般クエリーsqlでは、次のような書き込みクエリーがあります.
1.select * from table where id=1;
          1

これは鍵をかける目的を果たすことができません.つまり、他の事務では
2.update table set name='wind' where id=1;

トランザクション2は、前述のようにデータを変更し、commitは、トランザクション1が次の文を実行します.
3.select * from table where id=1;

名前フィールドの2回の結果が一致しないことがわかります.これは、データベース・トランザクションの同時実行時に発生する可能性のある繰り返し不可の読み取りです.
解決策は
select * from table where id=1 LOCK IN SHARE MODE;

この書き込みは、トランザクション1のローに共有ロックを追加します.トランザクション2はupdate文を実行しようとするとブロックされます.id=1のレコードにロックを付ける必要があり、共有ロックと共存できないためです.
*注意:共有ロック(S):1つのトランザクションが1つのローを読むことを許可し、他のトランザクションが同じデータセットの排他ロックを取得することを阻止します.排他ロック(X):排他ロックを取得するトランザクションの更新データを許可し、他のトランザクションが同じデータセットの共有リードロックと排他ライトロックを取得することを阻止します.*
MysqlのInnoDBエンジンはトランザクションをサポートし、デフォルトのトランザクション独立性レベルはREPEATABLEです.READ 1.READ_UNCOMMITEDこれはトランザクションの最も低い独立性レベルであり、別のトランザクションがコミットされていないデータを見ることができることを許可します.2.READ_COMMITEDは、あるトランザクションが変更したデータがコミットされた後、別のトランザクションによって読み込まれることを保証します.すなわち、別のトランザクションがコミットされていないデータを読み込めないことを保証します.3.REPEATABLE _READは、1つのトランザクションが同じ条件で前後2回取得したデータが一致することを保証する.SERIALIZABLEトランザクションは、順次実行されるように処理される.
1つのレコードに共有ロックを設定することで、同じレコードを2回読み出す結果が一致することを保証したり、他のトランザクションが同じレコードを変更しないことを保証したりすることができます.この方法は、同時トランザクションでクエリーsqlのデータ整合性を保証します.
通常、私たちは電子商取引の同時ウェブサイトで、同じ商品number数の更新に関連しています.トランザクション1では、ユーザーがサーバでデータベース接続で実行するタスクを表しています.begin; update goods set number=number-1 where good_id=#{id} and number>0; insert into detail(order_id,good_id ,user_name) values(null,1,”wind”); commit;
別のユーザが1つのデータベース接続で実行する必要があるトランザクション2はbeginです.⑴update goods set number=number-1 where good_id=#{id} and number>0; insert into detail(order_id,good_id ,user_name) values(null,1,”sea”); commit;
彼らは同じ商品、つまりgood_を求めているからです.idは一致するが、update文であるため、そのレコードにロックをかける必要がある.この場合、トランザクション1の実行中にトランザクション2が同時実行であるにもかかわらず、トランザクション2が⑴にブロックされ、トランザクション1 commit後にローロックが解放されると、トランザクション2がロックを追加して続行することに成功する.これにより、同じレコードへのアクセスで同時トランザクションが実現され、安全が保証され、超過購入されません.
突然考えがなくなった...これは私のいくつかの理解で、みんなに役に立つことを望んでいます.