大量のデータ修正時に1行のデータがロックされていることを発見し、ずっと待機状態の問題解決

2411 ワード

最近、マルチスレッドタスク処理コンポーネントが大量のビジネスデータを処理するために書かれ、ビジネスモニタリングデータから少量のビジネスデータが変更されると待機状態にあり、for updateロックテーブルのようにローをロックする場合が明らかになった.
この問題はシステム設計(複雑なビジネスロジック)によるもので、一時的にデータベース階層から解決するしかない.システム設計を修正するのは複雑で、そんなに時間がないからだ.
解決方法:
1.テーブルにロックされているセッションIDを検出します.serial#


SELECT object_name,machine,s.sid,s.serial#
FROM gv$locked_object l,dba_objects o,gv$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid;


SELECT o.object_name,s.sid, s.serial#
FROM v$lock l, dba_objects o, v$session s
WHERE l.id1 = o.object_id
AND l.sid = s.sid
AND o.object_name='SJ_AFFAIR';


2.killこのセッションを削除
alter system kill session 'sid, serial#';
3.コード一時最適化:「初期テーブル」データを修正する際のロック試行:for update nowait、このコストは少し高いようですが、このようなシーンは通常データ異常シーンなので、監視があれば十分です.7万票がたまに現れるので、しばらく代コードを処理しません.
理論の視覚障害者:
二、V$LOCKとV$LOCKED_OBJECT
クエリー・ロック・テーブルには、V$LOCKとV$LOCKEDが使用されます.OBJECTですが、この2つは同じではありません.まず、それぞれの主要フィールドを見てみましょう.
1.v$lock
sid:通常v$sessionに関連付けられたセッションSID.
type:ロックタイプ、TMはテーブルロックまたはDMLロック、TXはローロックまたはトランザクションロック、ULはユーザーロックを表します.私たちは主にTXとTMの2種類のロックに注目しています.他のロックはすべてシステムロックで、すぐに自動的に解放されます.注目しなくてもいいです.ロー・ロックは単独では保存されません.ロー・レベル・ロックの前にテーブル・レベルの共有ロックを追加する必要があります.
lmode:セッションが保持するロックのモード.
0=None;1=Null;2=Row-S(SS、行レベル共有ロック、他のオブジェクトはこれらのデータ行しかクエリーできません).3=Row-X(SX、行レベル排他ロック、提出前にDML操作を許可しない);4=Share(共有ロック);5=S/Row-X(SSX、共有行レベル排他ロック);6=Exclusive(排他ロック)
ID 1,ID 2:ID 1,ID 2の取値の意味はtypeの取値によって異なり、TMロックID 1に対してロックされたテーブルのobject_を表すidはdba_とobjectsビュー関連は具体的なテーブル情報を取得し、ID 2値は0である.TXロックID 1については、事務所が占有するロールバックセグメント番号とトランザクションスロットslot number番号を10進数で表し、そのグループ形式は0 xRRSSSS、RRRR=RBS/UNDO NUMBER、SSSS=SLOT NUMBER、ID 2はwrapを囲む回数、すなわちトランザクションスロットが再利用される回数を10進数で表す
2.V$LOCKED_OBJECT
session_id:セッションid.通常、v$sessionに関連付けられます.
object_id:ロックされたオブジェクト識別.通常dba_とobjects関連.
oracle_username:oracleユーザー名にログインします.
os_user_name:コンピュータのユーザー名:Administrator
locked_mode:セッションが保持するロックのモード.
三、両者の違い
1.V$LOCKED_OBJECTは待機しているテーブルレベルのロックしか報告できず、待機している行レベルのロックは報告できません.
注:この言葉はネット上で他の人が言ったもので、しばらく検証されていないので、慎重に考えなければなりません.しかし、私が直面した問題から見ると、正しいようです.ただ私の問題はもう再現できず、それを検証する機会を失った.
2.v$locked_objectには現在のDBにロックされているOBJECTが含まれているが、v$lockにはユーザだけでなく、システムがロックされているobjectも含まれている.すなわち、V$LOCK>v$locked_object