亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle鎖表問題怎么處理

發布時間:2021-12-22 09:27:23 來源:億速云 閱讀:166 作者:iii 欄目:關系型數據庫

本篇內容介紹了“oracle鎖表問題怎么處理”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

"ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效"的快速解決方法今天在導一個臨時表的數據,導出完成后準備清空數據,執行truncate命令時,遇到如下問題:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

解決方法如下:
=========================================================
SQL> select session_id from v$locked_object;

SESSION_ID
----------
       56

SQL> SELECT sid, serial#, username, osuser FROM v$session where sid = 56;

       SID    SERIAL# USERNAME                       OSUSER
---------- ---------- ------------------------------ ------------------------------
       56         2088 ghb                          fy

SQL> ALTER SYSTEM KILL SESSION '56,2088';

System altered

執行完上述命令后,提示會話斷開。重新連接數據庫,然后執行truncate操作,成功!


以下是原理部分
==============
Oracle數據庫的鎖類型

根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用于保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用于保護數據庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護數據庫的內部結構。

DML鎖的目的在于保證并發情況下的數據完整性,。在Oracle數據庫中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。

當Oracle 執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得后,系統再自動申請TX類型的鎖,并將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X 等多種模式,在數據庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。

在數據行上只有X鎖(排他鎖)。在 Oracle數據庫中,當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其他的會話處于等待狀態。當第一個會話提交后,TX鎖被釋放,其他會話才可以加鎖。

當Oracle數據庫發生TX鎖等待時,如果不及時處理常常會引起Oracle數據庫掛起,或導致死鎖的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。

悲觀封鎖和樂觀封鎖

一、悲觀封鎖
鎖在用戶修改之前就發揮作用:
Select ..for update(nowait)
Select * from tab1 for update
用戶發出這條命令之后,oracle將會對返回集中的數據建立行級封鎖,以防止其他用戶的修改。
如果此時其他用戶對上面返回結果集的數據進行dml或ddl操作都會返回一個錯誤信息或發生阻塞。
1:對返回結果集進行update或delete操作會發生阻塞。
2:對該表進行ddl操作將會報:Ora-00054:resource busy and acquire with nowait specified.

原因分析
此時Oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些數據進行的修改或刪除操作都必須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生阻塞,這個這個操作commit或rollback.
同樣這個查詢的事務將會對該表加表級鎖,不允許對該表的任何ddl操作,否則將會報出ora-00054錯誤::resource busy and acquire with nowait specified.

二、樂觀封鎖
樂觀的認為數據在select出來到update進取并提交的這段時間數據不會被更改。這里面有一種潛在的危險就是由于被選出的結果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建議是用悲觀封鎖,因為這樣會更安全。

阻塞
定義:
當一個會話保持另一個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。
4個常見的dml語句會產生阻塞

INSERT
UPDATE
DELETE
SELECT…FOR UPDATE


INSERT

Insert發生阻塞的唯一情況就是用戶擁有一個建有主鍵約束的表。當2個的會話同時試圖向表中插入相同的數據時,其中的一個會話將被阻塞,直到另外一個會話提交或會滾。一個會話提交時,另一個會話將收到主鍵重復的錯誤。回滾時,被阻塞的會話將繼續執行。

UPDATE 和DELETE當執行Update和delete操作的數據行已經被另外的會話鎖定時,將會發生阻塞,直到另一個會話提交或會滾。

Select …for update

當一個用戶發出select..for update的錯作準備對返回的結果集進行修改時,如果結果集已經被另一個會話鎖定,就是發生阻塞。需要等另一個會話結束之后才可繼續執行。可以通過發出 select… for update nowait的語句來避免發生阻塞,如果資源已經被另一個會話鎖定,則會返回以下錯誤:Ora-00054:resource busy and acquire with nowait specified.

死鎖-deadlock
定義:當兩個用戶希望持有對方的資源時就會發生死鎖.
即兩個用戶互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個用戶作為代價,另一個用戶繼續執行,犧牲的用戶的事務將回滾.
例子:
1:用戶1對A表進行Update,沒有提交。
2:用戶2對B表進行Update,沒有提交。
此時雙反不存在資源共享的問題。
3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。
4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個用戶繼續執行操作。
起因:
Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本上都會避免死鎖的發生。

DML鎖分類表

表1 Oracle的TM鎖類型
鎖模式 鎖描述 解釋 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行級共享鎖,其他對象只能查詢這些數據行 Select for update、Lock for update、Lock row share
3 SX(Row-X) 行級排它鎖,在提交前不允許做DML操作 Insert、Update、Delete、Lock row share
4 S(Share) 共享鎖 Create index、Lock share
5 SSX(S/Row-X) 共享行級排它鎖 Lock share row exclusive
6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive


1.關于V$lock表和相關視圖的說明

Column      Datatype                                     Description
ADDR        RAW(4 |8)                                    Address of lock state object
KADDR       RAW(4 |8)                                    Address of lock
SID         NUMBER                                       Identifier for session holding or acquiring the lock
TYPE        VARCHAR2(2)                                  Type of user or system lock. The locks on the user types are obtained by user applications. Any process that is blocking   others is likely to be holding one of these locks. The user type locks are:TM - DML enqueue  TX - Transaction enqueue  UL - User supplied
--我們主要關注TX和TM兩種類型的鎖
--UL鎖用戶自己定義的,一般很少會定義,基本不用關注
--其它均為系統鎖,會很快自動釋放,不用關注
ID1          NUMBER                                           Lock identifier #1 (depends on type)
ID2          NUMBER                                           Lock identifier #2 (depends on type)
---當lock type 為TM時,id1為DML-locked object的object_id
---當lock type 為TX時,id1為usn+slot,而id2為seq。
--當lock type為其它時,不用關注

LMODE              NUMBER                       Lock mode in which the session holds the lock:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)
--大于0時表示當前會話以某種模式占有該鎖,等于0時表示當前會話正在等待該鎖資源,即表示該會話被阻塞。
--往往在發生TX鎖時,伴隨著TM鎖,比如一個sid=9會話擁有一個TM鎖,一般會擁有一個或幾個TX鎖,但他們的id1和id2是不同的

REQUEST       NUMBER              Lock mode in which the process requests the lock:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)
--大于0時,表示當前會話被阻塞,其它會話占有改鎖的模式
CTIME         NUMBER              Time since current mode was granted
BLOCK         NUMBER              A value of either 0 or 1, depending on whether or not the lock in question is the blocker.


2.其它相關視圖說明
視圖名 描述 主要字段說明
v$session 查詢會話的信息和鎖的信息。
sid,serial#:表示會話信息。

program:表示會話的應用程序信息。
row_wait_obj#:表示等待的對象,和dba_objects中的object_id相對應。
lockwait :該會話等待的鎖的地址,與v$lock的kaddr對應.
v$session_wait 查詢等待的會話信息。 sid:表示持有鎖的會話信息。
Seconds_in_wait:表示等待持續的時間信息
Event:表示會話等待的事件,鎖等于enqueue

dba_locks 對v$lock的格式化視圖。
Session_id:和v$lock中的Sid對應。

Lock_type:和v$lock中的type對應。
Lock_ID1: 和v$lock中的ID1對應。
Mode_held,mode_requested:和v$lock中的lmode,request相對應。

v$locked_object 只包含DML的鎖信息,包括回滾段和會話信息。
Xidusn,xidslot,xidsqn:表示回滾段信息。和
v$transaction相關聯。
Object_id:表示被鎖對象標識。
Session_id:表示持有鎖的會話信息。
Locked_mode:表示會話等待的鎖模式的信息,和v$lock中的lmode一致。


以下是命令行部分
================
1.查詢數據庫中的鎖

select * from v$lock;
select * from v$lock where block=1;

2.查詢被鎖的對象

select * from v$locked_object;

3.查詢阻塞
查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');

查阻塞別的會話鎖
select * from v$lock where lmode>0 and type in ('TM','TX');

4.查詢數據庫正在等待鎖的進程
select * from v$session where lockwait is not null;

5.查詢會話之間鎖等待的關系
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;

6.查詢鎖等待事件
select * from v$session_wait where event='enqueue';

解決方案:
--首先得到被鎖對象的session_id

select session_id from v$locked_object;

--通過上面得到的session_id去取得v$session的sid和serial#,然后對該進程進行終止。

SELECT sid, serial#, username, osuser FROM v$session where sid = session_id;

--最后殺會話

ALTER SYSTEM KILL SESSION 'sid,serial';

“oracle鎖表問題怎么處理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥棱县| 古丈县| 景谷| 桦川县| 丹东市| 彭水| 贵阳市| 新安县| 天台县| 梁河县| 呼玛县| 堆龙德庆县| 历史| 衡山县| 阿拉尔市| 平江县| 永德县| 乾安县| 青阳县| 临潭县| 利辛县| 德安县| 蕲春县| 通许县| 广州市| 淅川县| 临邑县| 丽水市| 逊克县| 临汾市| 策勒县| 甘肃省| 滦南县| 千阳县| 江西省| 广灵县| 盐源县| 闵行区| 酉阳| 龙海市| 武清区|