sql >> データベース >  >> RDS >> Oracle

Oracle Locks&Table Locks:仕組み

    Oracleデータベースは、業界で広く使用されているデータベースです。ここでは、Oracleロック、Oracleテーブルロックについて説明しようとしています

    目次

    Oracleエンキューおよびロックとは

    エンキューは、操作を共有構造にシリアル化するOracleロックです。共有構造は、テーブル、REDOスレッド、およびトランザクションである可能性があります。

    ユーザーAがテーブルの行12を更新すると、トランザクションエンキュー(ロック)を取得します。これは、テーブル内の同じ行12を更新しようとしているすべてのユーザーが、ユーザーAがトランザクションをコミットするまで待機するように取得されます。したがって、ユーザーBが同じ行を更新しようとすると、エンキューで待機します。

    ユーザーAがトランザクションをコミットすると、ユーザーBのトランザクションが続行されます

    シングルインスタンスデータベースにはローカルエンキューがありますが、Oracle RACでは、共有リソースを管理するためのローカルエンキューとグローバルエンキューがあります

    エンキュー識別子とは

    エンキューは、フォーマットを使用して一意に識別されます

    <リソースタイプ>

    リソースはできます

    TM->テーブルロック

    MR->メディアリカバリ

    TX->トランザクション

    Id1とid2は、リソースタイプごとに異なる番号です

    テーブルロック(TM)と同様に、

    と記述されます。

    TM-<テーブルのオブジェクトID>-0

    ユーザーが特定のモードでリソースへのアクセスを要求すると、上記で説明したエンキュー識別子が生成されます

    エンキューはこれらのモードで保持されます

    SS:行共有モード

    SX:行排他モード

    S:テーブルを共有モードでロックします

    SSX:テーブルを共有モードでロックし、行を排他モードでロックします

    X:テーブルを排他モードでロックする

    エンキューリソースとは

    各エンキューは、Oracleサーバーによってリソース構造を介して維持され、上記のように識別されます。リソース構造には3つのリストがあります

    1. 所有者リスト
    2. 待機リスト
    3. コンバーターリスト

    ユーザーが特定のモードでリソースのロックを要求すると、ロック構造を取得し、特定のリソースのロックを取得するように要求します。これは、必要なロックに従って、リソース構造のこれらのリストに配置されます。

    >

    そのため、ユーザーは最初にそのリソースをリクエストし、次に所有者リストに配置されます

    リソース構造はリソーステーブルから取得され、ロック構造はロックテーブルから取得されます。どちらもSGAで割り当てられます

    リソーステーブルの行数は、初期化パラメータenqueue_resourcesによって定義されます。使用中の値は、v$resourceビューで確認できます

    ロック構造テーブルの行数は、初期化パラメータ_enqueue_locksによって定義されます。使用中の値はv$enqueue_lock

    で確認できます。

    リソーステーブルでのルックアップはどのように行われますか?

    • リソーステーブルには、すべてのリソース構造が含まれています。ハッシュアルゴリズムは、リソーステーブル内のリソース構造を見つけてアクセスするために使用されます。
    • リソーステーブルはハッシュバケットに配置されます。各ハッシュバケットには、リンクリスト形式のリソース構造のリストが含まれています。
    • リソースが検索の場合、ハッシュアルゴリズムを使用してそのハッシュが取得され、次にラッチが取得されて対応するハッシュバケットが検索され、リソースがハッシュバケット内のリストで検索されます。リソースが見つかると、ロック構造が取得され、リクエストは、リクエストされたロックの指定されたレベルに従って、所有者、ウェイター、および変換リストに配置されます。

    例TM-575-0リソースがバケット1にハッシュされ、ハッシュバケットにアクセスするためにラッチエンキューハッシュチェーンが取得され、リソース構造を取得するためにバケット内のリストにアクセスされます

    • リソースがバケットリストに見つからず、新しいリソース構造がリソースフリーリストから取得され、バケットリストに配置された場合。これは、ラッチエンキューの下で発生します。ロック構造も割り当てられます

    ロック要求は、リソース構造の所有者リストに配置されます

    エンキュー操作はどのように機能しますか?

    ユーザーがリソースのロックを要求すると、Oracleサーバーは次のことを行います

    • 現在所有されていない場合、リソースはユーザーに付与されます
    • 所有されていて、ウェイターとコンバーターがいる場合は、ウェイターキューの一番下に配置されます
    • 所有されているがウェイターとコンバーターがない場合、所有者ロックと互換性がある場合、リクエストは許可されます。互換性がない場合は、ウェイターリストに追加されます
    • リクエストが現在保持されているロックよりも制限が少ない場合、またはリクエストされたモードが他の所有者が保持しているロックと互換性がある場合、コンバータは続行できます
    • ウェイターは、コンバーターリストが空で、その前にウェイターがなく、要求されたロックが現在のロックと互換性がある場合に続行できます
    • コンバーターは常にウェイターの前に処理されます。
    • Oracleサーバーは、ロックが解放または変換されるたびにこれらのキューをチェックします。

    Oracleロックが解放または変換されたときにキューがチェックされる方法

    • リソースを待機しているプロセスはセマフォでスリープし、セマフォはスリープ/ウェイクアップメカニズムとして使用されます。キューにエンキューした後、要求しているプロセスはsync_op呼び出しを使用してセマフォでスリープします。

    sync_op(SYNC_WAIT、SYNCF_BINARY、300)=1

    • リソースを保持しているプロセスがリソースを解放する準備ができると、リソース構造に接続されているキューを調べます。キューにプロセスがある場合は、を使用して待機中のプロセスにセマフォ信号を送信します

    sync_op呼び出し。

    sync_op(0x0005、SYNCF_BINARY、134491620)=1

    • 待機中のプロセスがシグナルを処理し、ウェイクアップします。この待機プロセスは、エンキュー操作で指定された手順に従ってステータスを変更します

    一般的なタイプのエンキュー

    JQ –ジョブキュー。 ジョブ(DBMS_JOB.SUBMITによって送信された)が実行されている場合、そのジョブはJQエンキューによって保護されます(つまり、1つのSNPプロセスのみがジョブを実行できます)。

    ST –スペース管理トランザクション 。 STエンキューは、セッションがエクステントを割り当て/割り当て解除する(つまり、UET$およびFET$ディクショナリテーブルを変更する)たびに保持する必要があります。たとえば、合体、セグメントのドロップ/切り捨て、ディスクの並べ替えなどです。 STエンキューを要求するときにセッションがタイムアウトになると、「スペース管理を待機しているORA-1575タイムアウト」が返されます。

    TM – DML(テーブル)エンキュー。 セッションがテーブルをロックするたびに、TMエンキューが要求されます。セッションが親テーブル(DEPT)の行を削除し、参照制約(外部キー)が子テーブル(EMP)のインデックスなしで作成された場合、またはセッションが外部の列を更新している場合共有ロック(レベル4)へのキー参照は、子テーブルで取得されます。別のセッションが子テーブルに変更を加えようとすると、待機する必要があります(行排他モードでエンキューが必要であり、共有モードと互換性がないため)。子テーブルの外部キー列にインデックスが作成されている場合、子テーブルに共有ロックは必要ありません。

    TX –トランザクション。 トランザクションが開始されるとすぐに、TXエンキューが必要になります。トランザクションは、ロールバックセグメント番号、ロールバックセグメントのトランザクションテーブルのスロット番号、およびスロット番号のシーケンス番号によって一意に定義されます。いくつかの理由で、セッションがTXエンキューで待機している可能性があります。

    1)別のセッションが要求された行をロックしています。

    2)2つのセッションが同じ一意のキーをテーブルに挿入しようとすると(いずれもCOMMITを実行していません)、最後のセッションは最初のセッションがCOMMITまたはROLLBACKするのを待機しています。

    3)ブロックヘッダーに空きITL(対象トランザクションリスト)がありません(セグメントのINI_TRANSまたはPCT_FREEを増やします)。

    UL –ユーザーロック 。セッションがDBMS_LOCK.REQUEST関数でロックされました。

    OracleエンキューとOracleロックを表示するためのビューとテーブル

    V$sessionおよびv$session_wait

    セッションがエンキューまたはロックで待機している場合、これはV $ session(11g以降)およびv $ session_wait

    からのセッションである可能性があります。
     Select * from v $ session_wait where event like‘enq%’; enqueue wait eventのパラメータは次の意味を持ちますP1:リソースタイプとモードwantedP2:ID1 of the resourceP3:ID2 of the resource 

    以下のクエリを使用して、システム内のすべてのエンキューを取得できます

     v $ session_waitからevent、p1、p2、p3を選択します。ここで、wait_time =0および'enq%'のようなイベント; 
    1. V $ lockは、エンキューをチェックするためのもう1つの便利なビューです
    2. V $ lockは、現在システムに保持されているすべてのロック構造を一覧表示します
    3. 列タイプid1とid2は、リソース構造のリソースタイプid1とid2を表します。したがって、すべてのリソース構造のリストを含むV$resourceと結合できます。
    • LMODEとリクエストは、どのキュー(所有者、コンバーター、ウェイター)がセッションであるかを示します
    LMODE リクエスト キュー名
    > 0 =0 所有者
    =0 > 0 ウェイター
    > 0 > 0 コンバーター

    以下のクエリを使用して、所有者とウェイターを見つけることができます

     SELECT inst_id、DECODE(request、0、'Holder:'、'Waiter:')|| sid sess、id1、id2、lmode、request、typeFROM V $ LOCKWHERE(id1、id2、type)IN(SELECT id1 、id2、タイプFROM V $ LOCK WHERE request> 0)ORDER BY id1、request; 

    RACの場合、以下のクエリを使用してブロッカーとウェイターを見つけることができます

     SELECT inst_id、DECODE(request、0、'Holder:'、'Waiter:')|| sid sess、id1、id2、lmode、request、typeFROM GV $ LOCKWHERE(id1、id2、type)IN(SELECT id1 、id2、タイプFROM gV $ LOCK WHERE request> 0)ORDER BY id1、request; 

    V $ locked_object

    これは、Oracleテーブルロックのもう1つの便利なビューです

    データベース内のすべてのTMロックが含まれています。トランザクションスロット、OSプロセス、およびTMロックを保持しているセッションのセッションIDを提供します

    ロック情報を見つけるために使用できるいくつかのビューがあります。これらのビューはcatblock.sqlによって作成されます

    DBA_LOCKS v$lockのようなすべてのロックを表示する
    DBA_DML_LOCKS 保持または要求されているすべてのDML™ロックを表示します
    DBA_DDL_LOCKS 保持または要求されているすべてのDDLロックを表示します
    DBA_WAITERS 待機中のすべてのセッションを表示しますが、待機中のロックは表示しません
    DBA_BLOCKERS 待機中のロックを保持している非待機セッションを表示します

    Oracleで待機中のセッションと開催中のセッションを見つけるためのクエリ

     set linesize 1000column wait_session heading'WAITING | SESSION' column hold_session heading'HOLDING | SESSION' column lock_type format a15column mode_held format a15column mode_requested format a15selectwaiting_session、holding_session、lock_type、mode_held、mode_requested、lock_id1、lock_id2fromdba_ 

    すべてのロックされたオブジェクトを見つけるためのクエリ

     set term on; set lines 130; column sid_ser format a12 heading'session、| serial#'; column username format a12 heading'os user / | db user'; column process format a9 heading'os | process'; column spid format a7 heading'trace | number'; column owner_object format a35 heading'owner.object'; columnlocked_mode format a13 heading'locked | mode'; column status format a8 heading'status'; selectsubstr(to_char(l.session_id)| |'、' || to_char(s.serial#)、1,12)sid_ser、substr(l.os_user_name ||'/' || l.oracle_username、1,12)username、l.process、p.spid、 substr(o.owner||'。'||o.object_name、1,35)owner_object、decode(l.locked_mode、1、'No Lock'、2、'Row Share'、3、'Row Exclusive'、4 、'Share'、5、'Share Row Excl'、6、'Exclusive'、null)locked_mode、substr(s.status、1,8)statusfromv $ locked_object l、all_objects o、v $ session s、v $ process pwherel .object_id =o.object_idand l.session_id =s.sidand s.paddr =p.addrand s.status!='KILLED' / 

    OracleサーバーでのDMLロックの処理方法

    更新、挿入、削除、または更新の選択がoracleテーブルで実行されると、Oracleはこれらの2つのロックを取得します

    • DMLテーブルロック:トランザクションの期間中、オブジェクト定義の一貫性を確保します。これにより、DMLの進行中にDDL操作が発生するのを防ぎます。
    • DML行ロック:これは、トランザクションの実行中にデータの一貫性を確保するためです。これは、タッチされている特定の行のロックを取得し、同じ行を変更しようとしている他のトランザクションは、すでに所有している行が終了するまでブロックされるように言い換えることができます。

    Oracleテーブルロックの実装方法

    エンキューのインフラストラクチャについては、前のセクションですでに説明しました。 Oracleテーブルロック TMエンキューとして実装されます

    したがって、エンキュー構造は次のようになります

    TM-<テーブルオブジェクトID>-0

    モードは

    RS:行共有

    RX:行専用

    S:共有

    SRX:共有行専用

    X:排他的

    各カーソルは、ステートメントの解析中に作成されるテーブルロック構造のリストを維持します。最初の実行時に、関数呼び出しが行われ、リスト内のすべてのテーブルがロックされます。トランザクションがコミットまたはロールバックすると、ロックが解除されます。

    ロールバック、特に保存ポイントへのロールバックの可能性は、辞書のロックに複雑さの別の側面を追加します。つまり、ロックがアップグレードされた時点を超えてトランザクションがロールバックされた場合、人為的なデッドロックのリスクを減らすために、ロールバック操作の一部として、それに応じてロックをダウングレードする必要があります。

    トランザクションのディクショナリロックの要件、特にロック変換の履歴の維持は、TMエンキューと組み合わせたDMLロックによって提供されます。 DMLロックを保持しているすべてのトランザクションは、TMエンキューロックも保持しています。基本的なロック機能はエンキューによって提供され、DMLロックは変換履歴の維持を追加します。

    DMLロック構造の固定配列は、DML_LOCKSパラメーターによってサイズ設定されます。その空きリストはdmlロック割り当てラッチによって保護されており、アクティブなスロットはV$LOCKED_OBJECTに表示されます。

    DML_LOCKを設定するには、v$resource_limitで使用率を確認します。スペースが非常に少ないので、たっぷりと設定できます

    テーブルロックを無効にするにはどうすればよいですか?

    • DMLロックおよび関連するTMエンキューロックは、完全に無効にすることも、特定のテーブルに対してのみ無効にすることもできます。
    • これらのロックを完全に無効にするには、DML_LOCKSパラメーターをゼロに設定する必要があります。並列サーバーデータベースでは、すべてのインスタンスでゼロに設定する必要があります。
    • 特定のテーブルに対してこのようなロックを無効にするには、ALTERTABLEステートメントのDISABLETABLELOCKS句を使用する必要があります。
    • テーブルのロックが無効になっている場合でも、DMLステートメントはテーブルのブロックを変更でき、行レベルのロックは引き続き保持されます。ただし、通常はクエリに関連付けられているサブ共有モードのテーブルロック、および通常はDMLに関連付けられているサブ排他モードのテーブルロックは使用されません。代わりに、テーブルに対するトランザクションは、テーブル全体、つまりテーブルに対するすべてのDDLをロックしようとするすべての試みを単に禁止することにより、競合するDDLから保護されます。
    • テーブルロックを無効にすると、ロック取得のオーバーヘッドが減少するため、パフォーマンスが向上する可能性があります。これは、このオーバーヘッドが非常に高いRACの場合に特に重要です。
    • テーブルロックを無効にすると、外部キーインデックスの作成も防止されます。行が親テーブルで操作されている間、子テーブルのテーブルロックを回避するために外部キーにインデックスを付ける必要があるため。したがって、テーブルロックをすべて一緒に無効にすると、インデックスは必要ありません
    • alter tableを使用して、一部のテーブルのテーブルロックを無効にしてから、dml_locksテーブルに設定することをお勧めします。 dml_locksがゼロに設定されているかのように、インスタンスをバウンスして再度設定する必要があります
    • 直接ロード挿入では、セッションは「X」モードでTMエンキューを取得します。これにより、すべてのDDLをブロックするだけでなく、直接ロードが発生しているときに他のDMLが発生するのを防ぎます。

    DML行ロックの実装方法

    DML行ロックは、次の2つの組み合わせとして実装されます

    1. 行レベルのロック:各行ヘッダーのロックバイトと、各データまたはインデックスブロックのITL(対象トランザクションリスト)として実装されます。これらはどこにもキャッシュされず、制限されているSGAではなくブロック自体に格納されるため、Oracleによるロックのこのメカニズムは非常にスケーラブルです
    2. トランザクションロック:これらはTXエンキューとして実装されます

    ロックバイトはブロック内のITLエントリを指し、トランザクションのすべてのITLエントリは、トランザクションがコミットされているかロールバックされているかを最終的に決定するTXエンキューを指します。ウェイターはトランザクションロックを待ちます

    • トランザクションAは、ブロックの行2と3を更新しようとしています。 ITL(対象トランザクションリスト)を割り当てます。トランザクションは行2と3にアクセスし、ロックバイトを確認します。ロックバイトがゼロの場合、ロックされていません。トランザクションは行3、3を更新します
    • これでトランザクションBが開始され、行1を更新する必要があります。 ITL(対象トランザクションリスト)を割り当てます。トランザクションは行1にアクセスし、ロックバイトを確認します。ロックバイトがゼロの場合、ロックされていません。トランザクションは行1を更新します
    • ここで、トランザクションは行2を更新しようとしています。行にアクセスし、ロックバイトがゼロにならないため、行がロックされていることを検出します。ロックを保持しているITLを調べます。 ITLクリーンアウトを実行して、トランザクションがアクティブかどうかを確認します。この場合、トランザクションAがアクティブであることがわかります。したがって、トランザクションBは、トランザクションAがロールバックまたはコミットするのを待機する必要があります。トランザクションBは、トランザクションAが排他モードで保持するTXエンキューの要求を待機します

    関心のあるトランザクションリスト(ITL)とは

    セッションがブロックを変更する場合、ブロックにITLを割り当てる必要があります。 ITLは、トランザクションによって取得される多くのスロットを含むブロックヘッダーのデータ構造です。これは、テーブルの作成時にパラメータINITRANSおよびMAXTRANSによって定義されます。スロットの初期数はINITTRANSに従って作成され、MAXTRANSの最大数まで動的に増加します

    トランザクションとは何ですか?

    セッションが/delete/ insertを更新すると、トランザクションが開始されます。コミットまたはロールバックが発生したときに完了します。トランザクションは、トランザクション識別子(XID)によって識別されます。トランザクションIDは3つの部分で構成されています

    1. セグメント番号をロールバックまたは元に戻す
    2. トランザクションテーブルのスロット番号
    3. シーケンスまたはラップなし

    XID =usn#.slot#.wrap#

    各ブロックITLにはXIDが含まれます

    ITLクリーンアウトとは、ITLでXIDを検索し、これに基づいてロールバックセグメントを検索し、トランザクションテーブルとラップ番号を検索してトランザクションのアクティブ性を確認することを意味します。

    以下のコマンドを使用して、ロールバックセグメントをダンプできます

    システムダンプの元に戻すヘッダーを変更する<セグメント名を元に戻す>;

    アクティブな各トランザクションは、v$transactionテーブルに表示されます

     select addr、xidusn、xidslot、xidsqnfrom v $ transaction; ADDR XIDUSN XIDSLOT XIDSQN ------ ---------- ---------- --- -------3C485875 50 5 3000 

    トランザクション識別子(XID)は、

    を使用して独自のセッションで取得することもできます。
    デュアルからdbms_transaction.local_transaction_idを選択します;

    TX enqでの待機は、v $ session_wait

    に表示されます。

    P1:名前|モード

    P2:rbs3 | wrap#

    P3:スロット#

    DML行ロックを要約する

    トランザクションがまだ存在しないセッションの最初のDMLは、暗黙的にトランザクションを作成します。

    • 元に戻すセグメント番号、スロット、ラップが割り当てられます
    • TXエンキューがインスタンス化されます

    変更する行が特定されると、セッションはデータブロックのITLにエントリを取得し、それをトランザクションに割り当てます

    • USN / SLOT / WRAPはITLスロットに書き込まれ、現在のトランザクション用にそのスロットを予約します
    • 現在のトランザクションのITLスロットを指すように行ディレクトリのロックバイトを設定することにより、行でロックが取得されます

    TMとTXの両方のエンキューはV$lockで確認できます

    • タイプはTMまたはTXを識別します
    • ID1とID2は追加情報を伝達する場合がありますが、エンキュータイプに関してコンテキスト依存です
    • TMエンキューの場合、ID1はロックされているオブジェクトのOBJECT_IDであり、DBA_OBJECTSで参照でき、ID2は常に0です
    • TXエンキューの場合、ID1とID2は、取り消しセグメント番号、スロット番号、およびラップを保持します

    オラクルロックが機能していることを説明する詳細な例

    • ダミーテーブルを作成する
    jからテーブルを作成してselect*from dba_objects where rownum <3;Tablecreatedテーブルをj1からselect*from dba_objects where rownum <3; Table created 
    • セッションA
    更新するにはjから*を選択します;

    v$lockに何が含まれているか見てみましょう

     SQL> v$mystatから個別のsidを選択します。 SID ---------- 2125SQL> select * from v $ lock where sid =2125; ADDR KADDR SID TY ID1 ID2 LMODE ------------------ ------------- ---------- ------------ ---------- ----- -----リクエストCTIMEブロック-------------------------------- 00000006B5D9D0D0 00000006B5D9D148 2125 TX 2883613 16425600 360 21488781 0 30 44 0 

    ここに表示されます

    DMLOracleテーブルロックが作成されます

    TX(トランザクションロック)が作成されます

    • セッションBを始めましょう
    SQL>更新のためにj1から*を選択します;SQL>v$mystatから個別のsidを選択します; SID ---------- 2302SQL> select * from v $ lock where sid =2302; ADDR KADDR SID TY ID1 ID2 LMODE ------------------ ------------- ---------- ------------ ---------- ----- -----リクエストCTIMEブロック-------------------------------- 00000006AF7FF910 00000006AF7FF988 2302 TX 2949148 16884039 60 60 DA 4 FF 3 0FFFFFFFF7 33544 0 30 000000006DC289D60 00000006DC289DB8 2302 AE 15062272 0 
     ここに表示されます

    DMLテーブルロックが作成されます

    TX(トランザクションロック)が作成されます

    それでは、やってみましょう

    更新するにはjから*を選択します;

    これはハングします

    • 問題を分析するために別のセッションを開始しましょう

    V$lockにセッションsid=2032の詳細が表示されている場合

     select * from v $ lock where sid =2302; ADDR KADDR SID TY ID1 ID2 LMODE ----------------------------- --- ---------- -------------- ---------- ---------- REQUEST CTIME BLOCK-- -------- ----------------------------------------------------------------------------------------------- Fffffffff7Da4B3C0 2302 TM 33544 0 30 47 000000006DC289D60 0000000006DC289DB8 2302 AE 15062272 0 40 143 0 <強い> 000006DC280448000000006DC280443 0 2302 TX 2883613 16425600 0   6 7 0  FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 21488781 0 30 7 0 

    太字の行は、一部のTX enqのリクエスト6(排他的ロック)です

    これで、以下のクエリを使用してブロッキングセッションを見つけることができます

     select l1.sid、'IS BLOCKING'、l2.sidfrom v $ lock l1、v $ lock l2where l1.block =1 and l2.request> 0and l1.id1 =l2.id1and l1.id2 =l2.id2SID 'ISBLOCKING' SID ---------- ------------- ---------- 2125 IS BLOCKING 2302 

    これで、トランザクションBを続行するために、セッション2125をコミットまたはロールバックできます。以下のコマンドを使用してセッション2125を強制終了し、ロックを解除することもできます

    システム強制終了セッション「2125、<シリアル>」を変更します; 

    その他の追加情報

    v $ lockのTXロックは、競合が存在する行情報を通知しません。クエリを使用してそれらを表示できます

    以下のクエリは、待機中のセッションから実行する必要があります

     SQL> select row_wait_obj#、row_wait_file#、row_wait_block#、row_wait_row#from v $ session where sid =2302ROW_WAIT_OBJ#ROW_WAIT_FILE#ROW_WAIT_BLOCK#ROW_WAIT_ROW#------------- ----- --------- --------------- ------------- 21488781 461 81063 0 select do.object_name、row_wait_obj#、row_wait_file #、row_wait_block#、row_wait_row#、dbms_rowid.rowid_create(1、ROW_WAIT_OBJ#、ROW_WAIT_FILE#、ROW_WAIT_BLOCK#、ROW_WAIT_ROW#)from v $ session s、dba_objects dowhere sid =2302 and s.ROW_WAIT_J OBJECT_NAME ROW_WAIT_OBJ#ROW_WAIT_FILE#ROW_WAIT_BLOCK#ROW_WAIT_ROW#DBMS_ROWID.ROWID_C -------------- -------------- ----------- ---- ------------- ------------------ J21488781 461 81063 0 ABR + SNAHNAAATynAAA SQL> Select * from j where rowid ='ABR + SNAHNAAATynAAA'; 

    関連記事

    Oracleロックの仕組み
    Oracleデータベースでセッションの詳細を検索する方法
    重要なデータベースヘルスチェック
    oracleappsdbaインタビューの質問
    oracleデータベースでロックをチェックするためのクエリ
    oracledbaインタビューの質問

    推奨コース

    以下は、さらに一歩進んだ場合に購入できる推奨コースの一部です。

    以下にいくつかのコースへのリンクを示します


    Oracle DBA 11g / 12c –ジュニア​​DBAのデータベース管理 :このコースは、ジュニアDBAとして始めている人、またはOracleDBAを目指している人に適しています。これにより、バックアップとリカバリおよび一般的な管理タスクを十分に理解できます。
    Oracleデータベース:Oracle 12CR2RAC管理 :このコースでは、Oracle RACのインストール、管理について説明します。 OracleRACのスキルをアップグレードしたいOracleDBAに適したコース
    OracleDataGuard:Oracle12CR2のデータベース管理 :このコースでは、Oracle Dataguardのインストール、管理について説明します。 OracleDataguardのスキルをアップグレードしたいOracleDBAに適したコース


    1. MySQL(またはPHP?)はフィールドデータごとに結果をグループ化します

    2. アダプティブ結合しきい値

    3. モジュールの依存関係の使用、パート2

    4. PostgreSQLデータベースをSQLServerデータベースに移行する方法は?