データベース管理システムにおける同時実行制御のタスクは、データベース内の同じデータに同時にアクセスする複数のトランザクションが、トランザクションの分離性と統一性、およびデータベースの統一性を破壊しないようにすることです。 楽観的ロックと悲観的ロックの同時実行制御で使用される主な技術的手段 悲観的ロック リレーショナル データベース管理システムでは、悲観的同時実行制御 (PCC) は同時実行制御の方法です。トランザクションが他のユーザーに影響を与えるような方法でデータを変更することを防ぎます。トランザクションが操作内の各データ行にロックを適用する場合、トランザクション ロックが解除されると、他のトランザクションはロックと競合する操作のみを実行できます。 悲観的同時実行制御は、主に、データの競合が激しく、同時実行の競合が発生したときにロックを使用してデータを保護するためのコストが、トランザクションをロールバックするコストよりも低い環境で使用されます。 悲観的ロックとは、外部(システム内の他の現在のトランザクションや外部システムからのトランザクション処理を含む)によって変更されるデータに対する保守的(悲観的)な態度を指します。したがって、データはサマー処理プロセス全体にわたってロックされます。悲観的ロックの実装は、一般的にデータベースが提供するロック機構に依存します(推奨チュートリアル:MySQLチュートリアル) データベースでは、悲観的ロックのプロセスは次のようになります。
MySQL InnoDB での悲観的ロックの使用 悲観的ロックを使用するには、MySQL データベースの自動コミット プロパティをオフにする必要があります。これは、MySQL がデフォルトで自動コミット モードを使用するため、更新操作を実行すると、MySQL が結果をすぐにコミットすることを意味します。 //トランザクションの開始 begin;/begin work;/start transaction; (3つのうち1つを選択) 更新のために、id=1 の t_goods からステータスを選択します。 //商品情報に基づいて注文を生成します insert into t_orders (id,goods_id) values (null,1); //商品ステータスを2に変更 t_goods を更新し、status=2 を設定します。 //トランザクションをコミットする commit;/作業をコミットする; 上記のクエリ ステートメントでは、select...for update メソッドが使用され、排他ロックを開くことによって悲観的ロックが実装されています。対応するレコードはロックされ、他のトランザクションは、このトランザクションがコミットされるまで実行を待機する必要があります。 データをロックするために select ... for update を使用しますが、ロック レベルに注意する必要があります。MySQL InnoDB はデフォルトで行レベルのロックを使用します。行レベルのロックはすべてインデックスに基づいています。SQL ステートメントでインデックスが使用されない場合は、行レベルのロックは使用されず、テーブル全体のロックにはテーブルレベルのロックが使用されます。 特徴 データ処理のセキュリティを保証します 効率の面では、ロック メカニズムによってデータベースに追加のオーバーヘッドが発生し、デッドロックの可能性が高まります。 読み取り専用トランザクションでは競合がないため、ロックを使用する必要がなく、システム負荷が増加し、並列性が低下します。 楽観的ロック 楽観的同時実行制御も同時実行制御方式です。 複数の同時トランザクションが処理中に互いに影響を及ぼさず、各トランザクションがロックを生成せずに影響を受けるデータの一部を処理できると仮定します。データ更新を送信する前に、各トランザクションは、トランザクションがデータを読み取った後に他のトランザクションがデータを変更したかどうかをまず確認します。変更された場合、送信中のトランザクションはロールバックされます。 楽観的ロックは悲観的ロックとは異なります。楽観的ロックでは、データが競合しないことを前提としています。したがって、データが送信および更新されるときに、データが競合しているかどうかを正式にチェックします。競合が見つかった場合は、ユーザーにエラー メッセージが返され、ユーザーが対処方法を決定できます。 楽観的ロックでは通常、レコード バージョン番号を使用してデータにバージョン識別子を追加し、データが更新されるとバージョン識別子を更新します。 成し遂げる バージョン番号を使用する場合、データを初期化するときにバージョン番号を指定でき、データの更新操作ごとにバージョン番号に対して +1 操作が実行されます。現在のバージョン番号がデータの最新バージョン番号であるかどうかを判断します
特徴 楽観的同時実行制御では、トランザクション間のデータ競合の可能性は小さいと判断され、可能な限り直接的に処理を進め、トランザクションがコミットされるまでロックしないため、ロックやデッドロックは発生しません。 以下もご興味があるかもしれません:
|
<<: iconfontアイコンライブラリをvueに導入するエレガントな実践記録
>>: Linux ログ内のキーワードとその前後の情報を検索する方法の例
Linux は iftop を使用してネットワーク カードのトラフィックをリアルタイムで監視します。...
目次1. フィルターの概念1. グローバルフィルターのフォーマットをカスタマイズする2. フィルター...
目次1. オプションとは何ですか? 2. 含まれる属性3. エントリー属性エルデータ方法コンポーネン...
この記事の例では、アコーディオン効果を実現するためのVueの具体的なコードを参考までに共有しています...
インストール手順1. 仮想マシンを作成する 2. [カスタム(詳細)]を選択し、[次へ]をクリックし...
目次Vueのレスポンシブシステムの基本原則1. Object.definePropertyの使い方を...
1.dockerをオンラインでダウンロードする yum インストール -y epel-release...
目次posgresql バックアップ/リストアMySQL バックアップ/復元posgresql バッ...
目次概要フロントエンド知識システムフロントエンドの3つの要素プレゼンテーション層 (CSS)動作レイ...
この記事では、ローカル yum ソースを使用して CentOS 上に LAMP 環境を構築する方法に...
序文count 関数は、テーブルまたは配列内のレコードをカウントするために使用されます。count(...
目次1. はじめに2. ポイントフィーチャーレイヤーの集約3. 重合の特殊処理4. 重合の特殊処理 ...
Mysql-connector-java ドライバのバージョンの問題私のデータベースのバージョンは ...
この記事では、MySQL の左結合における on 条件と where 条件の使用法の違いを例を使って...
1. コマンドの紹介seq (シーケンス) コマンドは、指定されたステップ サイズに従って、開始番号...