序文ロックは一般的に、楽観的ロックと悲観的ロックに分けられます。簡単に言うと、楽観的ロックはバージョン番号によって制御され、悲観的ロックはロックによって制御されます。 以下はテストに使用するデータです # ユーザーテーブルを追加する CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(255) NOT NULL COMMENT '名前', 主キー (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 デフォルト CHARSET=utf8; #3つのレコードを挿入 INSERT INTO `users` (`id`, `name`) 価値観 (1、「雪山飛豚」) (2、「陳瓊河」)、 (3、 'cqh'); クエリ結果は次のとおりです。 1. 楽観的ロック基本原則は、制御用のバージョン フィールドを追加することです。 UPDATE users SET name="雪山飞猪" WHERE id=3 ユーザーを更新します。SET name="chenqionghe" WHERE id=3 上記の 2 つの SQL ステートメントは最終的に正常に更新され、最後の更新結果がメインのものになります。 解決策はバージョンフィールドを追加することです バージョンフィールドを追加するALTER TABLE users ADD `version` INT NOT NULL DEFAULT '0' 解決策は、バージョンフィールドを追加し、それを各更新のwhere条件に追加し、更新することです。 ユーザーを更新します。SET name="雪山飞猪",version=version+1 WHERE id=3 AND version=0 ユーザーを更新します。SET name="chenqionghe",version=version+1 WHERE id=3 AND version=0 今回は、更新は 1 回だけ成功し、最初にレコードを取得した人がマスターになります。これは、現在のプロセスが正常に更新された後にバージョン番号が変更され、2 番目のプロセスがこのレコードを見つけることができないためです。 2. 悲観的ロック実際、これはGo言語のMutexとRwMutexの読み取りロックに似ています。 読み取りロック共有ロックまたは S ロックとも呼ばれる共有ロックがデータ テーブルに追加されると、テーブルは読み取り専用モードになります。 完全なテーブルロック (LOCK TABLE table READ)構文は次の通りです LOCK TABLE テーブル読み取り テーブルのロックを解除します。 1つテストしてみましょう。最初のプロセスは実行されます LOCK TABLE ユーザーは読み取ります。 2番目のプロセスは通常の読み取りを実行する SELECT * FROM users WHERE id=1; 通常通りクエリを実行できます。もう一度アップデートしてみましょう ユーザーを更新します。SET name="chenqionghe" WHERE id=1 待ち時間がありました。 最初のプロセスのロックを解除します 2番目のプロセスを見ると、正常に更新されています 行ロック (SELECT ... LOCK IN SHARE MODE)始める; SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE 専念; トランザクションで使用する必要があります。BEIN の開始後、ロックされた行は外部からのみクエリ可能であり、更新することはできません。 テストしてみましょう。最初のプロセスは 始める; SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE ここでは、ID 1 と 2 の行がロックされています。 2番目のプロセスは更新を実行します UPDATE users SET name="雪山飞猪" WHERE id=1 またしても待ち時間が発生しました。 専念; 2回目のプロセス更新は次のように成功しました。 書き込みロック排他ロック、排他ロックは読み取りと書き込みが不可能であると理解され、構文は次のとおりです。 完全なテーブルロック (LOCK TABLE table WRITE)LOCK TABLE ユーザーは書き込みます。 この時点で、テーブル全体がロックされています。別のプロセスを使用して、ID 1 のデータをクエリしてみましょう。 SELECT * FROM users WHERE id=1 ご覧のとおり、クエリはすでに待機中です。 テーブルのロックを解除 この時点で、2番目のプロセスはすぐにクエリに成功します。 行ロック (SELECT ... FOR UPDATE)データを更新すると (INSERT、DELETE、UPDATE)、データベースは自動的に排他ロックを使用して、他のトランザクションがデータを操作できないようにします。 始める; SELECT * FROM users WHERE id IN (1,2) LOCK IN SHARE MODE 専念; もう一度テストしてみましょう。最初のプロセスは、ID 1 と 2 のレコードをロックします。 始める; SELECT * FROM users WHERE id IN (1,2) FOR UPDATE 注: この時点ではトランザクションはコミットされていません まず、2番目のプロセスを使用して、ID 3(ロックされていない)のレコードを更新します。 ユーザーを更新します。SET name="chenqionghe" WHERE id=3 実行は成功しました。 ユーザーを更新します。SET name="chenqionghe" WHERE id=1 待機が発生し、ロックされたことを示します。 専念; 2番目のプロセスをもう一度見てください。正常に更新されています。 簡単に言うと、楽観的ロックはバージョン管理を使用し、悲観的テーブル ロックは通常は必要なく、行読み取りロックは LOCK IN SHARE MODE を使用し、書き込みロックは FRO UPDATE を使用します。とても簡単です。 上記は、MySQL のロックと同時実行の制御方法の詳細です。MySQL のロックと同時実行の制御の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Nginx がフロントエンド リソースへのクロスドメイン アクセスの問題をどのように解決するかの詳細な説明
1. MySQL アーカイブ (解凍版) をダウンロードするURL: https://downloa...
テクノロジーの活用itext.jar: バイト ファイル入力ストリームを画像、PDF などに変換しま...
目次最初のステップステップ2ステップ3ステップ4 Alipay 決済インターフェースへの接続に関する...
次のように、Windows/MacOS からログインした Linux の SSH ターミナルで簡単に...
CSS を導入する方法には、インライン スタイル、内部スタイル シート、外部スタイル シートの 3 ...
目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...
基礎1. スキャフォールディングを使用してプロジェクトを作成し、開始する1.1 足場を設置する: n...
目次1. プロジェクトの説明2. Nginxイメージの作成3. MySQLイメージの作成4. PHP...
目次1. エラーメッセージ2. エラーの原因3. 解決策1. エラーメッセージ1. インストール後、...
シングルページアプリケーションを開発する場合、特定のルートを入力し、パラメータに基づいてサーバーから...
夜にMACの電源を入れたところ、突然ルートアカウントがMySQLに正常にログインできなくなったため、...
序文通常のビジネスニーズ: 写真、Excel などをアップロードします。結局のところ、数 MB のサ...
目次Dockerイメージのダウンロードmysqlとnacosを起動する独自のJavaプロジェクトを変...
WSLとはBaidu 百科事典からの一節を引用します。 Windows Subsystem for ...
キャラクター小数点文字番号エンティティ名---未使用空間---スペースバー! ! ---感嘆符「 」...