Oracle では、「更新用」は行レベルのロックであり、行に行レベルのロックを課すために使用されます。ロックされたユーザーはデータ行のクエリと更新を行うことができますが、他のユーザーはクエリを実行できませんロックされた行の構文は、「SELECT * FROM テーブル名 WHERE 列名 FOR UPDATE;」です。
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
1. 更新定義の場合
for update は行レベルのロックであり、排他的とも呼ばれます。ロック: ユーザーが行レベルのロックを行に適用すると、そのユーザーはロックされたデータ行をクエリおよび更新できますが、他のユーザーはロックされたデータ行をクエリのみでき、更新できません。他のユーザーがテーブル内のデータ行を更新したい場合は、テーブルに行レベルのロックも適用する必要があります。複数のユーザーがテーブルに対して共有更新を使用する場合でも、2 つのトランザクションが同時にテーブルを更新することはできず、実際にテーブルが更新されると、トランザクションがコミットまたは復元されるまでテーブルは排他的にロックされます。行ロックは常に排他ロックです。
共有更新ロックは、次のいずれかの条件が発生した場合にのみ解放されます:
1. コミット (COMMIT) ステートメントを実行します
2. データベースを終了します (LOG) OFF)
3. プログラムの実行が停止します
2. 概念と使用法
通常、select ステートメントはデータをロックせず、実行を妨げません。他の DML および DDL 操作に影響を与えます。同時に、マルチバージョンの一貫した読み取りメカニズムのサポートにより、select ステートメントは他のタイプのステートメントによってブロックされません。
select ... for update ステートメントは、私たちがよく使用する手動ロック ステートメントです。データベースの更新のために select ... を実行すると、データベース内のテーブルまたは特定の行データがロックされることがわかります。mysql では、クエリ条件に主キーが含まれている場合、行データがロックされます。そうしないと、テーブルがロックされます。
InnoDB のデフォルトは行レベル ロックであるため、主キーが「明確に」指定されている場合にのみ、MySQL は行ロック (選択されたデータのみをロック) を実行します。それ以外の場合、MySQL はテーブル ロック (データ全体をロックします) を実行します。形状)。
例: id と name の 2 つの列を持つテーブル user があり、id が主キーであるとします。
例 1: (主キーを明示的に指定し、データが存在する、行ロック)
SELECT * FROM user WHERE id=3 FOR UPDATE; SELECT * FROM user WHERE id=3 and name='Tom' FOR UPDATE;
例 2: (主キーを明示的に指定するが、データが存在しない、いいえlock)
SELECT * FROM user WHERE id=0 FOR UPDATE;
例 3: (主キーが不明瞭、テーブル ロック)
SELECT * FROM user WHERE id<>3 FOR UPDATE; SELECT * FROM user WHERE id LIKE '%3%' FOR UPDATE;
例 4: (主キーなし、テーブル ロック)
SELECT * FROM user WHERE name='Tom' FOR UPDATE;
注:
1. FOR UPDATE のみ InnoDB に適用され、有効にするにはトランザクション処理モジュール (BEGIN/COMMIT) 内にある必要があります。
2. ロック状況をテストするには、MySQL のコマンド モードを使用してテスト用の 2 つのウィンドウを開きます。
3. Myisam はテーブルレベルのロックのみをサポートしますが、InnerDB は行レベルのロックをサポートします (行レベルのロック/テーブルレベルのロック) ロックが追加されたデータは、他のトランザクションでロックしたり、他のトランザクションで変更したりすることはできません。テーブルレベルのロックの場合、レコードがクエリされるかどうかに関係なく、テーブルはロックされます。
3. いつアップデートする必要がありますか?
for update ステートメントを使用すると、アプリケーション レベルでデータのロックと保護の操作を手動で実装できます。ビジネスレベルの排他的なデータが必要な場合は、更新に使用することを検討できます。
電車の切符の予約などでは、画面上に切符が表示されますが、実際に切符を発券する際には、他のクライアントによってデータが変更されていないことを再確認する必要があります。したがって、この確認プロセス中に、アップデートに使用できます。
4. 更新悲観的ロックの場合
悲観的ロック: 常に最悪のシナリオを想定し、データを取得するたびに他の人がそれを変更すると考えるため、 time データが取得されるたびにロックされるため、他の人がデータを取得しようとしても、ロックが解除されるまでブロックされます。このようなロック メカニズムの多くは、行ロック、テーブル ロック、読み取りロック、書き込みロックなど、従来のリレーショナル データベースで使用されており、操作前にすべてロックされます。 update と同様に、Java での synchronized キーワードの実装も悲観的ロックです。
楽観的ロック: 名前が示すように、非常に楽観的です。データを取得するたびに、他の人がデータを変更しないと考えてロックしません。ただし、更新するときは、このデータを更新するには、バージョン番号などのメカニズムを使用できます。オプティミスティック ロックは、スループットを向上させることができるマルチ読み取りアプリケーション タイプに適しています。データベースによって提供される write_condition メカニズムは、実際にはオプティミスティック ロックです。
推奨チュートリアル: 「Oracle ビデオ チュートリアル 」
以上がOracleでの更新の使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。