国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-oracle的鎖查詢及處理

這篇具有很好參考價值的文章主要介紹了大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-oracle的鎖查詢及處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、Oracel 的鎖介紹

oracle造成鎖表的情況:

1.1、查看鎖的對象視圖:

select object_id,session_id,locked_mode from v$locked_object;

1.2、鎖的級別

0:none
1:null 空
2:Row-S 行共享(RS):共享表鎖
3:Row-X 行專用(RX):用于行的修改
4:Share 共享鎖(S):阻止其他DML操作
5:S/Row-X 共享行專用(SRX):阻止其他事務(wù)操作
6:exclusive 專用(X):獨立訪問使用 。

1.3 常用的sql會造成鎖表

1、select … from … for update; 3 級鎖
2、insert / update / delete .(DML)… ; 3級鎖
3、創(chuàng)建索引的時候也會產(chǎn)生3,4級別的鎖
4、主外鍵約束時 update / delete … ; 可能會產(chǎn)生4,5的鎖
5、DDL(alter,drop)語句可能會產(chǎn)生時是6的鎖

在鎖定中,存在以下兩種基本的模式。

排他鎖(Exclusive,簡稱X鎖):一旦用戶對某個資源添加了X鎖,則其他用戶都不能再對該資源添加任何類型的鎖,直到該用戶釋放了資源上的X鎖為止。

共享鎖(Share,簡稱S鎖):一旦用戶對某個資源添加了S鎖,則其他用戶都不能在該資源上添加X鎖,只能添加S鎖,直到該用戶釋放了資源上的S鎖為止。

根據(jù)被保護的對象種類的不同,鎖定可以分成多種類型,比如由于DDL引起的鎖定、DML事務(wù)引起的鎖定、分布式事務(wù)中涉及的鎖定等。我們主要應(yīng)該關(guān)注DML事務(wù)引起的鎖定。

1.4 DML事務(wù)鎖定的機制

鎖定能夠保證當(dāng)某個用戶正在更新表里的一行數(shù)據(jù)時,其他用戶不能同時更新相同的數(shù)據(jù)行,而且也不能刪除或修改被更新的表。

鎖定分為兩種級別:行級別(TX鎖)和表級別(TM鎖)。

1.4.1 行級鎖(TX鎖)

假設(shè)某個用戶(假設(shè)為A)發(fā)出如下的語句更新一條記錄:

update employees set last_name='HanSijie' 
where employee_id=100;

Oracle在對該SQL進行解析以后,找到employee_id為100的記錄所在的數(shù)據(jù)塊(假設(shè)為58號數(shù)據(jù)塊),并找一個可用的undo數(shù)據(jù)塊,將last_name列上被更新前的舊值放入該undo數(shù)據(jù)塊,然后在數(shù)據(jù)塊頭部分配一個ITL槽,在該ITL槽里存放當(dāng)前的事務(wù)ID號、SCN號、所使用的undo數(shù)據(jù)塊的地址,以及當(dāng)前還未提交的標(biāo)記等信息。接下來,在58號數(shù)據(jù)塊中,找到被更新的數(shù)據(jù)行,在其頭部設(shè)置一個鎖定標(biāo)記,并在頭部記錄當(dāng)前事務(wù)所使用的ITL槽的槽號。做完這些工作以后,將控制權(quán)(也就是光標(biāo))返回給用戶。該鎖定標(biāo)記說明當(dāng)前用戶在被修改的數(shù)據(jù)行上已經(jīng)添加了X鎖。

如果這時,另一個用戶(假設(shè)為N)也對employee_id為100的記錄進行修改,則其過程和上面描述的一樣,只不過B在對數(shù)據(jù)行的頭部設(shè)置鎖定標(biāo)記時,發(fā)現(xiàn)該數(shù)據(jù)行頭部已經(jīng)有一個鎖定標(biāo)記了,說明該記錄已經(jīng)被添加了X鎖,于是用戶進程N必須等待,等待該X鎖被釋放。

可以看到,Oracle數(shù)據(jù)庫是在物理層面上實現(xiàn)對數(shù)據(jù)行的鎖定問題。而且鎖定一條記錄,并不影響其他用戶對該記錄的讀取。比如,如果當(dāng)前有一個用戶(假設(shè)為C)發(fā)出SQL語句,檢索employee_id為100的記錄信息,這時服務(wù)器進程發(fā)現(xiàn)被檢索的記錄有鎖定標(biāo)記,說明當(dāng)前該記錄已經(jīng)被其他用戶修改了,但是還沒提交。于是根據(jù)數(shù)據(jù)行頭部記錄的ITL槽的槽號,在數(shù)據(jù)塊頭部找到該ITL槽,并根據(jù)其中記錄的undo數(shù)據(jù)塊的地址,找到該undo數(shù)據(jù)塊,將其中所保存的改變前的舊值取出,并據(jù)此構(gòu)建CR(Consistent Read一致性讀)塊,該CR塊中的數(shù)據(jù)就是被更新的數(shù)據(jù)塊(也就是58號數(shù)據(jù)塊)在更新前的內(nèi)容。于是根據(jù)該CR塊的內(nèi)容,將用戶所需要的信息返回給C。

對于Oracle數(shù)據(jù)庫來說,行級鎖只有X鎖定模式,沒有S鎖定模式。Oracle的鎖定總是盡可能地在最低級別上完成。比如更新數(shù)據(jù)行時,僅僅是鎖定被更新的數(shù)據(jù)行,并不會鎖定同一個數(shù)據(jù)塊中的其他數(shù)據(jù)行,也不會阻塞其他用戶查詢被更新的數(shù)據(jù)行。

1.4.2 表級鎖(TM鎖)

還是接著上面的例子,這時A用戶已經(jīng)發(fā)出了更新employee_id為100的記錄的SQL語句。當(dāng)A還沒有提交之前,另外一個用戶D發(fā)出下面的語句:

drop table employees;

或者是 update 沒有走索引

由于用戶A還沒有提交所做的事務(wù),因此該事務(wù)還沒有結(jié)束,其他用戶還不能刪除該表,否則A所發(fā)出的事務(wù)就無法正常結(jié)束。為了阻止這時用戶D的刪除操作,我們能夠想到的最直觀的方法就是,在執(zhí)行刪除表的命令之前,先依次檢查employees表里的每一條記錄,查看每一條數(shù)據(jù)行的頭部是否存在鎖定標(biāo)記,如果是,則說明當(dāng)前正有事務(wù)在更新該表,刪除表的操作必須等待。

顯然,這種方式會引起很大的性能問題,Oracle不會采用這種方式。實際上,當(dāng)我們在對employees表的數(shù)據(jù)進行更新時,不僅會在數(shù)據(jù)行的頭部記錄行級鎖,而且還會在表的級別上添加一個表級鎖。那么當(dāng)D用戶要刪除表時,發(fā)現(xiàn)employees表上具有一個表級鎖,于是等待。

通過這種在表級別上添加鎖定的方式,我們就能夠比較容易并且高效地(因為不需要掃描表里的每一條記錄來判斷在表上是否有DML事務(wù))對鎖定進行管理了。表級鎖共具有五種模式,如下所示。

行級排他鎖(Row Exclusive,簡稱RX鎖)

當(dāng)我們進行DML時會自動在被更新的表上添加RX鎖,或者也可以通過執(zhí)行l(wèi)ock命令顯式的在表上添加RX鎖。在該鎖定模式下,允許其他的事務(wù)通過DML語句修改相同表里的其他數(shù)據(jù)行,或通過lock命令對相同表添加RX鎖定,但是不允許其他事務(wù)對相同的表添加排他鎖(X鎖)。

行級共享鎖(Row Shared,簡稱RS鎖)

通常是通過select … from for update語句添加的,同時該方法也是我們用來手工鎖定某些記錄的主要方法。比如,當(dāng)我們在查詢某些記錄的過程中,不希望其他用戶對查詢的記錄進行更新操作,則可以發(fā)出這樣的語句。當(dāng)數(shù)據(jù)使用完畢以后,直接發(fā)出rollback命令將鎖定解除。當(dāng)表上添加了RS鎖定以后,不允許其他事務(wù)對相同的表添加排他鎖,但是允許其他的事務(wù)通過DML語句或lock命令鎖定相同表里的其他數(shù)據(jù)行。

共享鎖(Share,簡稱S鎖)

通過lock table in share mode命令添加該S鎖。在該鎖定模式下,不允許任何用戶更新表。但是允許其他用戶發(fā)出select …from for update命令對表添加RS鎖。

排他鎖(Exclusive,簡稱X鎖)

通過lock table in exclusive mode命令添加X鎖。在該鎖定模式下,其他用戶不能對表進行任何的DML和DDL操作,該表上只能進行查詢。

共享行級排他鎖(Share Row Exclusive,簡稱SRX鎖)

通過lock table in share row exclusive mode命令添加SRX鎖。該鎖定模式比行級排他鎖和共享鎖的級別都要高,這時不能對相同的表進行DML操作,也不能添加共享鎖。

二、死鎖的定位方法

通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機器是哪一臺。

2.1 用dba用戶查看死鎖

select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)

如果有輸出的結(jié)果,則說明有鎖,且能看到死鎖的機器是哪一臺。字段說明:
Username:死鎖語句所用的數(shù)據(jù)庫用戶;
Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。
Status: 狀態(tài),active表示被死鎖
Machine: 死鎖語句所在的機器。
Program: 產(chǎn)生死鎖的語句主要來自哪個應(yīng)用程序。

2.2、用dba用戶查看到被死鎖的語句

select sql_text from v$sql where hash_value in 
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

三、死鎖的解決方法

一般情況下,只要將產(chǎn)生死鎖的語句提交就可以了,但是在實際的執(zhí)行過程中。用戶可能不知道產(chǎn)生死鎖的語句是哪一句??梢詫⒊绦蜿P(guān)閉并重新啟動就可以了。經(jīng)常在Oracle的使用過程中碰到這個問題,所以也總結(jié)了一點解決方法。

3.1、查找死鎖的進程

sqlplus “/as sysdba” (sys/change_on_install)

SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS 
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

3.2 查看引起鎖的語句

select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID, C.SESSION_ID,  B.SERIAL#, C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,
       ''''||C.Session_ID||','||B.SERIAL#||''''
from v$sql A, v$session B, v$locked_object C
where A.HASH_VALUE = B.SQL_HASH_VALUE and
B.SID = C.Session_ID

3.2、kill掉這個死鎖的進程:

alter system kill session ‘sid,serial#’; 
#(其中sid=l.session_id)

3.3、如果還不能解決:

select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;

其中sid用死鎖的sid替換

ps -ef|grep spid

其中spid是這個進程的進程號,kill掉這個Oracle進程

(1)鎖表查詢的代碼有以下的形式:

select count(*) from v$locked_object;
select * from v$locked_object;

(2)查看哪個表被鎖

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

(3)查看是哪個session引起的

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

(4)殺掉對應(yīng)進程
執(zhí)行命令:

alter system kill session'1025,41';

其中1025為sid,41為serial#.

四、綜上所訴形成kill語句

SELECT SQ.SQL_TEXT, SQ.SQL_FULLTEXT, A.OBJECT_ID, A.LOCKED_MODE, A.SESSION_ID,C.serial#, B.OBJECT_NAME, P.PID, P.SPID, 
 'ALTER SYSTEM KILL SESSION '''||C.sid|| ', '||C.serial#|| '''; ' 
  FROM V$LOCKED_OBJECT A, DBA_OBJECTS B, V$SESSION C, V$PROCESS P, V$SQLAREA SQ
 WHERE A.OBJECT_ID = B.OBJECT_ID
   AND A.SESSION_ID = C.SID(+)
   and c.SQL_ID=sq.SQL_ID(+)
   AND C.PADDR = P.ADDR;

五、行級鎖查詢處理

SELECT l.sid, s.blocking_session blocker, s.event, l.type, l.lmode, l.request, o.object_name, o.object_type
FROM v$lock l, dba_objects o, v$session s
WHERE UPPER(s.username) = UPPER('sys')
AND   l.id1        = o.object_id (+)
AND   l.sid        = s.sid
ORDER BY sid, type;

查看機器、用戶、狀態(tài)、SQL語句、連接工具

SELECT username, machine, type, status,SID,SERIAL#,MODULE,ACTION,EVENT#,EVENT
from v$session T
WHERE username IN('SYS')
AND SID IN (SELECT SID
FROM v$lock
WHERE  TYPE='TM');


SELECT a.username, a.machine, a.type, a.status,a.SID,a.SERIAL#,a.PROGRAM,a.MODULE,
a.MODULE,a.ACTION,a.EVENT#,a.EVENT,b.type
from v$session a 
left join  v$lock b on a.sid = b.sid
where a.USERNAME = 'SYS'  AND b.TYPE = 'TM';

oracle鎖查詢,數(shù)據(jù)庫-玩轉(zhuǎn)數(shù)據(jù)-Oracle,oracle,大數(shù)據(jù),數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-732044.html

SELECT l.sid, s.blocking_session blocker,s.event,l.type,
l.lmode,l.request,o.object_name,o.object_type,s.SQL_ID,s.ACTION
FROM v$lock l, dba_objects o, v$session s
WHERE UPPER(s.username) = UPPER('sys')
AND   l.id1        = o.object_id (+)
AND   l.sid        = s.sid
ORDER BY sid, type;
select * from v$sqlarea b where b.SQL_ID = 'd1scr63zq42gf'

到了這里,關(guān)于大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-oracle的鎖查詢及處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 導(dǎo)出Oracle數(shù)據(jù)庫sqlplus命令行查詢的結(jié)果到文件

    導(dǎo)出Oracle數(shù)據(jù)庫sqlplus命令行查詢的結(jié)果到文件

    在Oracle數(shù)據(jù)庫sqlplus命令行操作時,如果想將SQL查詢出來的結(jié)果導(dǎo)出到文件中,可以使用SQLPlus中的 SPOOL 命令來將查詢結(jié)果導(dǎo)出到文件。 1.開啟日志記錄:使用SPOOL命令,指定需要輸出的文件路徑及文件名。例如: SPOOL /存放路徑/oracle.txt 2.執(zhí)行SQL查詢語句:你可以輸入任何需要

    2024年02月15日
    瀏覽(22)
  • Oracle數(shù)據(jù)庫中,授權(quán)某用戶可以查詢其他用戶的表

    在Oracle數(shù)據(jù)庫中,授權(quán)一個用戶可以查看其他所有用戶的表,需要執(zhí)行以下步驟: 使用數(shù)據(jù)庫管理員賬號連接到Oracle數(shù)據(jù)庫。 通過 GRANT 命令給用戶授予必要的權(quán)限。例如,如果要授權(quán)用戶 user1 可以查看所有其他用戶的表,可以執(zhí)行以下命令: 這條命令將授予 user1 ?SELECT

    2024年02月08日
    瀏覽(63)
  • oracle查詢數(shù)據(jù)庫內(nèi)全部的表名、列明、注釋、數(shù)據(jù)類型、長度、精度等

    oracle查詢數(shù)據(jù)庫內(nèi)全部的表名、列明、注釋、數(shù)據(jù)類型、長度、精度等

    Oracle查詢數(shù)據(jù)庫內(nèi)全部的表名、列明、注釋、數(shù)據(jù)類型、長度、精度 效果圖: 字段排序,根據(jù)表名對字段進行排序

    2024年02月06日
    瀏覽(16)
  • java serverlets使用數(shù)據(jù)源連接oracle數(shù)據(jù)庫,并執(zhí)行查詢操作代碼

    java serverlets使用數(shù)據(jù)源連接oracle數(shù)據(jù)庫,并執(zhí)行查詢操作代碼

    package chap03; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Statement; import java.util.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Namin

    2024年02月08日
    瀏覽(26)
  • 查詢服務(wù)器tns文件路徑,oracle數(shù)據(jù)庫tns配置方法詳解

    查詢服務(wù)器tns文件路徑,oracle數(shù)據(jù)庫tns配置方法詳解

    Oracle中TNS的完整定義:transparence Network Substrate透明網(wǎng)絡(luò)底層, 監(jiān)聽服務(wù)是它重要的一部分,不是全部,不要把TNS當(dāng)作只是監(jiān)聽器。 上圖中的CGDB和STDCG就是對應(yīng)的TNS,HOST是指向數(shù)據(jù)庫服務(wù)器的IP,當(dāng)然局域網(wǎng)內(nèi)用計算機名稱也是可以的。通過客戶端Net Manager創(chuàng)建一個連接到數(shù)據(jù)

    2024年02月09日
    瀏覽(92)
  • SQL Server、MySQL和Oracle數(shù)據(jù)庫分頁查詢的區(qū)別與聯(lián)系

    SQL Server、MySQL和Oracle數(shù)據(jù)庫分頁查詢的區(qū)別與聯(lián)系

    摘要:本文將通過一個現(xiàn)實例子,詳細解釋SQL Server、MySQL和Oracle這三種常見關(guān)系型數(shù)據(jù)庫在分頁查詢方面的區(qū)別與聯(lián)系。我們將提供具體場景下的SQL語句示例,并解釋每個數(shù)據(jù)庫的分頁查詢用法以及優(yōu)化方法,幫助讀者更好地選擇適合自己需求的分頁查詢方式。 假設(shè)我們有一

    2024年02月11日
    瀏覽(65)
  • Oracle數(shù)據(jù)庫面試題 精選 Oracle 面試題

    1.解釋冷備份和熱備份的不同點以及各自的優(yōu)點 冷備份 發(fā)生在數(shù)據(jù)庫已經(jīng)正常關(guān)閉的情況下,將關(guān)鍵性文件拷貝到另外位置的一種說法。適用于所有模式的數(shù)據(jù)庫。 優(yōu)點 1. 是非??焖俚膫浞莘椒ǎㄖ恍杩截愇募?2. 容易歸檔(簡單拷貝即可) 3. 容易恢復(fù)到某個時間點上(只

    2024年02月05日
    瀏覽(25)
  • 【Oracle】收集Oracle數(shù)據(jù)庫內(nèi)存相關(guān)的信息

    【Oracle】收集Oracle數(shù)據(jù)庫內(nèi)存相關(guān)的信息

    【聲明】文章僅供學(xué)習(xí)交流,觀點代表個人,與任何公司無關(guān)。 編輯|SQL和數(shù)據(jù)庫技術(shù)(ID:SQLplusDB) Oracle數(shù)據(jù)庫包含多個內(nèi)存區(qū)域,每個區(qū)域都包含多個子組件。 Oracle Database Memory Structures 根據(jù)具體問題的需要,可以通過如下命令收集Oracle數(shù)據(jù)庫內(nèi)存相關(guān)的信息。 例: 注:SET

    2024年01月21日
    瀏覽(30)
  • 【Oracle】使用 SQL Developer 連接 Oracle 數(shù)據(jù)庫

    SQL Developer 是 Oracle 官方推出的一款免費的數(shù)據(jù)庫開發(fā)工具,它提供了豐富的數(shù)據(jù)庫開發(fā)功能,其中包括連接 Oracle 數(shù)據(jù)庫的功能。 在本文中,我們將從多個方面詳細闡述如何使用 SQL Developer 連接 Oracle 數(shù)據(jù)庫。 在連接 Oracle 數(shù)據(jù)庫前,需要需要做一些準(zhǔn)備工作,包括安裝 SQ

    2024年02月06日
    瀏覽(24)
  • Oracle數(shù)據(jù)庫

    Oracle數(shù)據(jù)庫

    ①層次型數(shù)據(jù)庫 ②網(wǎng)狀型數(shù)據(jù)庫 ③關(guān)系型數(shù)據(jù)庫(主要介紹) E-R圖:屬性(橢圓形),實體(矩形),聯(lián)系(菱形-一對一、一對多、多對多) 注:有的聯(lián)系也有屬性 關(guān)系型數(shù)據(jù)庫的設(shè)計范式: 第一范式(1NF):屬性不可再分,字段保證原子性 第二范式(2NF):在滿足1

    2024年02月08日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包