oracle 會話 lock,相克軍_Oracle體系_隨堂筆記014-鎖 latch,lock

1、Oracle鎖類型

鎖的作用

latch鎖:chain,鏈

LOCK鎖

排他鎖(X)

共享鎖(S)

2、行級鎖:DML語句

事務鎖TX

鎖的結構

事務鎖的加鎖和解鎖過程

只有排他鎖

不影響讀(CR塊)

3、表級鎖:TM

行級排他鎖(Row exclusive)RX鎖

當我們進行DML時,會自動在被更新的表上添加RX鎖,可以執行LOCK命令顯式的在表上添加RX鎖

允許其他事務通過DML語句修改相同表里的其他數據行

允許使用lock命令對表添加RX鎖定

不允許其他事務對表添加X鎖

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

select … from for update

共享鎖(Share,簡稱S鎖)

通過lock table in share mode命令添加該S鎖

排他鎖(Exclusive,簡稱X鎖)

通過lock table in exclusive mode命令添加X鎖

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

通過lock table in share row exclusive mode命令添加SRX鎖

4、鎖的兼容性

a8e60cbf83410cd3447c738d0b316415.png

5、加鎖語句以及鎖的釋放

lock table in [row share][row exclusive][share][share row exclusive][exclusive] mode;

6、鎖相關視圖

v$transaction

XIDUSN表示當前事務使用的回滾段的編號

XIDSLOT說明該事務在回滾段頭部的事務表中對應的記錄編號(也可以叫做槽號)

XIDSQN說明序列號

STATUS說明該事務是否為活動的

v$lock

記錄了session已經獲得的鎖定以及正在請求的鎖定的信息

SID說明session的ID號

TYPE說明鎖定鎖定級別,主要關注TX和TM

LMODE說明已經獲得的鎖定的模式,以數字編碼表示

REQUEST說明正在請求的鎖定的模式,以數字編碼表示

BLOCK說明是否阻止了其他用戶獲得鎖定,大于0說明是,等于0說明否

鎖定模式?? ??? ?鎖定簡稱?? ?編碼數值

Row Exclusive?? ??? ?RX ?? ??? ?3

Row Shared ?? ??? ?RS?? ??? ?2

Share ?? ? ?? ??? ?S ?? ??? ?4

Exclusive ?? ??? ?X ?? ??? ?6

Share Row Exclusive ?? ?SRX ?? ??? ?5

NULL ??? ??? ??? ?N/A ?? ??? ?0或者1

v$enqueue_lock

該視圖中包含的字段以及字段含義與v$lock中的字段一模一樣。

只不過該視圖中只顯示那些申請鎖定,但是無法獲得鎖定的session信息。

其中的記錄按照申請鎖定的時間先后順序排列,先申請鎖定的session排在前面,排在前面的session將會先獲得鎖定。

v$locked_object

記錄了當前已經被鎖定的對象的信息

XIDUSN表示當前事務使用的回滾段的編號

XIDSLOT說明該事務在回滾段頭部的事務表中對應的記錄編號

XIDSQN說明序列號

OBJECT_ID說明當前被鎖定的對象的ID號,可以根據該ID號到dba_objects里查找被鎖定的對象名稱

LOCKED_MODE說明鎖定模式的數字編碼

v$session

記錄了當前session的相關信息

SID表示session的編號

SERIAL#表示序列號

SID和SERIAL#可以認為是v$session的主鍵,它們共同唯一標識一個session

grant select on v_$mystat to hr;

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘a‘ where department_id=60;

select xidusn,xidslot,xidsqn,status from v$transaction;

selectsid,type,id1,id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

blockfromv$lockwhere sid=&sid;

select object_name from dba_objects where object_id=&object_id;

對于TM鎖來說,ID1表示被鎖定的對象的對象ID,ID2始終為0

對于TX鎖來說,ID1表示事務使用的回滾段編號以及在事務表中對應的記錄編號,ID2表示該記錄編號被重用的次數(wrap)

將ID1拆解

select trunc(393249/power(2,16)) as undo_blk#,bitand(393249,to_number(‘ffff‘,‘xxxx‘)) + 0 as slot# from dual;

再次打開一個session

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘b‘ where department_id=60;

selectsid, type, id1, id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

blockfromv$lockwhere sid in(&sid1,&sid2)order by sid;

再次打開一個會話

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘c‘ where department_id=60;

查詢v$enqueue_lock來獲得鎖定隊列中的session信息

selectsid,type,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_modefromv$enqueue_lockwhere sid in(&sid1,&sid2);

select a.sid blocker_sid, a.serial#, a.username asblocker_username, b.type,

decode(b.lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

b.ctimeas time_held,c.sid aswaiter_sid,

decode(c.request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

c.ctime time_waitedfromv$lock b, v$enqueue_lock c, v$session awhere a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = ‘TX‘ and b.type = ‘TX‘ and b.block = 1

order by time_held, time_waited;

alter system kill session ‘&sid,&serial‘;

一個事務修改多行,產生一個TX鎖

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘a‘ where department_id=60;update departments set department_name=‘unknow‘ where department_id=10;update locations set city=‘unknown‘ where location_id=1100;

selectsid, type, id1, id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,blockfromv$lockwhere sid=&sid;

可以獲得的TX鎖定的總個數由初始化參數transactions決定,而可以獲得的TM鎖定的個數則由初始化參數dml_locks決定

select name, value from v$parameter where name in(‘transactions‘,‘dml_locks‘);

select resource_name as "R_N", current_utilization as "C_U", max_utilization as "M_U", initial_allocation as"I_U"fromv$resource_limitwhere resource_name in(‘transactions‘,‘dml_locks‘);

7、死鎖

兩個session(以A和C來表示),如果A持有C正在申請的鎖定,同時C也持有A正在申請的鎖定時,這時發生死鎖現象。死鎖是典型的“雙輸”情況,如果任其發展,則會出現A和C這兩個session正在執行的事務都無法結束的現象。因此,在Oracle數據庫中,造成死鎖的那個DML語句會被撤銷。死鎖總是由于應用程序設計不合理引起的。

當某個session的事務引起了死鎖時,Oracle會自動將阻塞該事務的其他事務中相應的DML語句撤銷,而阻塞該事務的其他事務中的其他DML語句并沒有撤銷。

session 1

select sid from v$mystat where rownum=1;update employees set last_name=last_name||‘a‘ where employee_id=100

session 2

select sid from v$mystat where rownum=1;update employees set last_name=last_name||‘b‘ where employee_id=101;

session 1

update employees set last_name=last_name||‘c‘ where employee_id=101;

session 2

update employees set last_name=last_name||‘d‘ where employee_id=100;

原文:http://www.cnblogs.com/jyzhao/p/3819381.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395582.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395582.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電線之間:采訪Microsoft Edge性能PM Nolan Lawson

by Vivian Cromwell通過維維安克倫威爾(Vivian Cromwell) 電線之間:采訪Microsoft Edge性能PM Nolan Lawson (Between the Wires: An interview with Microsoft Edge performance PM Nolan Lawson) I interviewed Nolan Lawson, Web Performance PM at Microsoft E…

swift菜鳥入門視頻教程-09-類和結構體

本人自己錄制的swift菜鳥入門,歡迎大家拍磚,有什么問題能夠在這里留言。主要內容:類和結構體對照 結構體和枚舉是值類型 類是引用類型 類和結構體的選擇 集合(collection)類型的賦值與復制行為視頻地址:百度…

oracle的集合操作符,[Oracle] Oracle的集合操作符

Oracle的集合操作包括: union , intersect , minus.[例子]假設有兩個表a,b如下:SQL> select * from a;COLA----------123SQL> select * from b;COLB----------345union : 得到兩個結果集的并集(不含重復值)SQL> select * from a2 union3 select * from b;COLA------…

鎖大全與 GDB調試

1.innodb_lock_monitor:打開鎖信息的方式 mysql> create table innodb_lock_monitor(id int) engineInnoDB; Query OK, 0 rows affected, 1 warning (2.29 sec) mysql> begin work; Query OK, 0 rows affected (0.00 sec) mysql> update t set val val 1…

[筆試面試題] 8-面向對象篇

面向對象篇 1 面向對象與面向過程的含義以及區別? 面向對象 面向對象是把數據及對數據的操作方法放在一起,作為一個相互依存的整體,即對象。對同類對象抽象出其共性,即類,類中的大多數數據,只能被本類的方法…

管理員所有權代碼_為什么代碼所有權糟透了,您永遠不應該在有實踐的地方工作...

管理員所有權代碼Code ownership sucks.代碼所有權糟透了。 It limits code and stunts your growth as a developer.它限制了代碼并阻礙了您作為開發人員的成長。 Let’s look at what code ownership is and why it destroys individuals and organizations.讓我們看看什么…

AngularJS 自定義控件

AngularJS Custom Directives 好討厭不帶日期的博客,而且說得好啰嗦 自定義指令介紹 AngularJS 指令作用是在 AngulaJS 應用中操作 Html 渲染。比如說,內插指令 ( {{ }} ), ng-repeat 指令以及 ng-if 指令。 當然你也可以實現自己的。這就是 AngularJS 所…

oracle 監聽加密 tcps,通過oracle wallet配置listener tcps加密

一 配置客戶端和服務端的wallet2端配置方法一致,相互添加證書orapki wallet create -wallet "/u01/oracle/wallet" -pwd Wdkf984jkkgekj434FKFD -auto_login_localorapki wallet add -wallet "/u01/oracle/wallet" -pwd Wdkf984jkkgekj434FKFD …

[財務知識] debt debit credit 的區別于聯系

https://blog.csdn.net/sjpljr/article/details/70169303 劍橋詞典解釋分別為: Debt [C or U ] n.something, especially money, which is owed to someone else, or the state of owing something借款,欠款;債務He ran/got into debt ( borr…

SpringMVC視圖解析器

SpringMVC視圖解析器 前言 在前一篇博客中講了SpringMVC的Controller控制器,在這篇博客中將接著介紹一下SpringMVC視 圖解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的DispatcherServlet處理,接著 Spring會分析看…

TIOBE 10月編程語言排行榜 : GO 問鼎本年度語言 ?

距離2016年度編程語言的公布只剩3個月了,誰將奪得桂冠? 與去年同期相比,2016年只有Go語言和Groovy語言的增長率超過了1%。 需要注意的是,Groovy語言2015年以一個爆炸性增長的收尾,所以到2017年1月左右的增長速度可能不…

校友郵箱_freeCodeCamp校友網絡:FCC校友的自主指導網絡

校友郵箱by peterWeinberg彼得溫伯格 freeCodeCamp校友網絡:FCC校友的自主指導網絡 (The freeCodeCamp Alumni Network: A homegrown mentorship network for FCC alumni) For the last year, I’ve been spending nearly all my free time learning to code. I’v…

oracle severity,ORACLE10G如何清除OEM下的歷史警告信息

ORACLE10G如何清除OEM下的歷史警告信息問題描述:OEM的HOME頁面可以顯示ORACLE的報警信息,但報警事件清除后該信息不會自動清除。隨著時間的增長,信息量逐漸加大,解決方法是手工予以清除。SampleCluster DatabaseTablespaces FullT…

使用 ReSharper,輸入即遵循 StyleCop 的代碼格式化規范

StyleCop 可以幫助強制執行代碼格式化規范,ReSharper 可以幫助你更高效地編寫代碼。把兩者結合起來,你便能高效地編寫符合團隊強制格式化規范的代碼來。 本文就介紹如何使用 ReSharper 來高效地遵循 StyleCop 的代碼格式化規范。 本文內容 安裝插件 Styl…

Oracle數據庫備份恢復,巡檢須要關注的對象設置以及相關恢復概述

數據庫備份恢復。巡檢須要關注的對象設置: 1.數據庫名稱,以及DBID; --dbid在v$database中 SYSORCL>select dbid,name from v$database; DBID NAME ---------- --------- 1385095721 ORCL 2.控制文件的位置; s…

Python迭代器

一、文件迭代器 readline()每次讀取文件的一行,每次調用readline方法會自動到下一行,到文件末尾時,會返回空字符串。 _next_()方法同readline()一樣,只是到最后一行會引發stopiterat…

成千上萬的在線課程時,如何保持理智和學習編碼

by Travis Chan通過特拉維斯陳 成千上萬的在線課程時,如何保持理智和學習編碼 (How to stay sane and learn to code when there are thousands of online courses) We live in the information age. Information about anything we can think of is accessible to…

oracle中noguarantee,聊聊UNDO_RETENTION作用(修改guarantee)

oracle10g中,針對dba_tablespace,加了其中一個額外列是retention.回憶一下Oracle 10g之前,在自動Undo管理的模式下,我們都知道undo_retention參數的作用是用來控制當transaction被commit之后,undo信息的保留時間。這些undo信息可以…

【Hankson 的趣味題】

可能我只適合這道題的50分 但還是要爭取一下的 我們知道對于\(gcd\)和\(lcm\)有這樣的定義 \(a\prod _{i1}^{\pi(a)}p_i^{d_{i}}\) \(b\prod _{i1}^{\pi(b)}p_i^{g_{i}}\) 那么則有 \(gcd(a,b)\prod_{i1}^{\pi(max(a,b))} p_i^{min(g_i,d_i)}\) \(lcm(a,b)\prod_{i1}^{\pi(max(…

C# 控件雙緩沖控制 ControlStyles 枚舉詳解

ControlStyles 枚舉.NET Framework 4指定控件的樣式和行為。 此枚舉有一個 FlagsAttribute 特性,通過該特性可使其成員值按位組合。 命名空間: System.Windows.Forms程序集: System.Windows.Forms(在 System.Windows.Forms.dll …