ホームページ  >  記事  >  データベース  >  Oracleでの更新の使用法は何ですか

Oracleでの更新の使用法は何ですか

WBOY
WBOYオリジナル
2022-03-02 12:05:3714811ブラウズ

Oracle では、「更新用」は行レベルのロックであり、行に行レベルのロックを課すために使用されます。ロックされたユーザーはデータ行のクエリと更新を行うことができますが、他のユーザーはクエリを実行できませんロックされた行の構文は、「SELECT * FROM テーブル名 WHERE 列名 FOR UPDATE;」です。

Oracleでの更新の使用法は何ですか

このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。

Oracle での for update の使用法は何ですか

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 &#39;%3%&#39; FOR UPDATE;

例 4: (主キーなし、テーブル ロック)

SELECT * FROM user WHERE name=&#39;Tom&#39; 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。