一、Oracle的锁
锁是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间“相互干涉”的核心机制。
1、锁的类型
(1)DML锁:允许并发执行数据修改,特定数据行上的锁或表中的所有行的锁。
(2)DDL锁:保护对象结构定义。
(3)Latch锁:这是Oracle内部锁,用来协调对期共享数据结构的访问。
2、LOCK锁的模式
(1)空锁(NULL)
(2)排它锁(X)
(3)共享锁(S)
二、DML锁
1、TX锁:修改数据的事务在执行期间会获得这种锁。
TX锁的模式:排它锁(X)
TX锁和行级锁:TX锁不是行锁,一个事务不管修改了多少行,都只会有一个TX锁。TX锁算是行锁的代表,行锁上发生了等待,会表 现为TX锁的等待。行锁是属于事务的,事务开始,行锁产生,事务结束,行锁也被释放。
两个会话时DML操作同一行数据,会产生阻塞,操作如下:
会话125号,更新id=1这行数据。
gyj@OCM> select distinct sid from v$mystat;
SID
----------
125
gyj@OCM> update t5 set name='aaaaaa' where id=1;
1 row updated.
事务未提交!!
会话145,同时也更新id=1这行数据。
gyj@OCM> select distinct sid from v$mystat;
SID
----------
145
gyj@OCM> update t5 set name='bbbbb' where id=1;
这里被阻塞了!
查v$lock视图
sys@OCM>select TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from v$lock where sidin(125,145);
TY ID1 ID2LMODE REQUEST CTIMEBLOCK
-- ---------- ---------- ---------- ---------- ---------- ----------
AE 100 0 4 0 1647 0
AE 100 0 4 0 682 0
TX 65539 2978 0 6 770
TO 65908 1 3 0 676 0
TM 74709 0 3 0 77 0
TM 74709 0 3 0 206 0
TX 65539 2978 6 0206 1
TX锁的标识:TX-ID1-ID2 --ID1表示事务使用的回滚段编号以及在事务表中对应的记录编号,ID2表示该记录编号被重用的次数(wrap)
将ID1拆解:ID1是由4个字节组成的,高位2个字节和低位2个字节分别表示v$trasaction中的xidusn,xidslot
selecttrunc(id1/power(2,16)) as undo_blk#,bitand(id1,to_number('ffff','xxxx')) + 0 asslot# from dual;
另一计算方法:selectto_char(id1,'xxxxxxx') from dual;
查询持有锁和请求锁的信息:v$lock
gyj@OCM> desc v$lock
名称是否为空?类型
----------------- -------- ------------
ADDR RAW(4):锁状态对象的地址V$transaction.addr V$session.taddr这个其实是事务地址
KADDR RAW(4):锁的地址。此列是真正的锁地址。V$session.lockwait
SID NUMBER:持有或获得锁的会话
TYPE VARCHAR2(2):用户或系统锁的类型
ID1 NUMBER:锁的标识
ID2 NUMBER:锁的标识
LMODE NUMBER:会话持有的锁的模式,0 - none、1 - null(NULL)、2 - row-S (SS)、3
- row-X (SX)、4 - share (S)、5 - S/Row-X (SSX)、6 - exclusive (X)
REQUEST NUMBER:进程正在请求锁的模式,模式类型同上。
CTIME NUMBER:当前模式持续的时间
BLOCK NUMBER:当前锁是否正在阻塞其他的锁(1:是,0:不是)
系统进程也可能持有锁,系统锁被持有很短的时间,系统锁有如下类型:
System Type
|
Description
|
System Type
|
Description
|
AT
|
Lock held for the ALTER TABLE statement
|
NA..NZ
|
Library cache pin instance (A..Z = namespace)
|
BL
|
Buffer hash table instance
|
PF
|
Password File
|
CF
|
Control file schema global enqueue
|
PI, PS
|
Parallel operation
|
CI
|
Cross-instance function invocation instance
|
PR
|
Process startup
|
CU
|
Cursor bind
|
QA..QZ
|
Row cache instance (A..Z = cache)
|
DF
|
datafile instance
|
RT
|
Redo thread global enqueue
|
DL
|
Direct loader parallel index create
|
SC
|
System change number instance
|
DM
|
Mount/startup db primary/secondary instance
|
SM
|
SMON
|
DR
|
Distributed recovery process
|
SN
|
Sequence number instance
|
DX
|
Distributed transaction entry
|
SQ
|
Sequence number enqueue
|
FS
|
File set
|
SS
|
Sort segment
|
HW
|
Space management operations on a specific segment
|
ST
|
Space transaction enqueue
|
IN
|
Instance number
|
SV
|
Sequence number value
|
IR
|
Instance recovery serialization global enqueue
|
TA
|
Generic enqueue
|
IS
|
Instance state
|
TS
|
Temporary segment enqueue (ID2=0)
|
IV
|
Library cache invalidation instance
|
TS
|
New block allocation enqueue (ID2=1)
|
JQ
|
Job queue
|
TT
|
Temporary table enqueue
|
KK
|
Thread kick
|
UN
|
User name
|
LA .. LP
|
Library cache lock instance lock (A..P = namespace)
|
US
|
Undo segment DDL
|
MM
|
Mount definition global enqueue
|
WL
|
Being-written redo log instance
|
MR
|
Media recovery
|
2、TM锁:表级锁
TM锁的主要作用,在DML期间,防止对表的DDL操作,可以确保对象的结构不被修改,例如,如果你已经更新了一个表,会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROP或ALTER命令。如果你有表的一个TM锁,而另一个用户试图在这个表上执行DDL,操作如下,他不会得到以下错误消息:
会话一
gyj@OCM> select distinct sid from v$mystat;
SID
----------
125
gyj@OCM> delete from t5 where id=1;
1 row deleted.
事务没提交!
会话二:
gyj@OCM> drop table t5;
drop table t5
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified ortimeout expired
查v$lock视图
gyj@OCM> select TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK fromv$lock where sid=125;
TY ID1 ID2LMODE REQUEST CTIMEBLOCK
-- ---------- ---------- ---------- ---------- ---------- ----------
AE 100 0 4 0 1171 0
TM 74709 0 3 0 241 0
TX 196641 3996 6 0 241 0
锁的标识:TM-ID1-ID2 --ID1表示被锁定的对象的对象ID,ID2始终为0
TM锁的模式:
代码
|
锁模式
|
表
|
行
|
0-None
|
没有锁
|
-
|
-
|
1-Null
|
空锁
|
-
|
-
|
2-SS(RS)
|
行级共享锁。Row Share
|
-
|
共享
|
3-SX(RX)
|
行级排它锁。Row Exclusive
|
-
|
排他
|
4-S
|
表共享锁Share
|
共享
|
-
|
5-SSX(SRX)
|
表共享行排它锁。Share Row Exclusive
|
共享
|
排他
|
6-X
|
表排它锁。Exclusive
|
排他
|
-
|
通过lock tablet10 in row share mode;命令添加RS锁
通过lock tablet10 in row exclusive mode;命令对表添加RX锁定;
通过select
… from forupdate命令添加RX锁
通过lock tablet10 in share mode;命令添加该S锁(wait for ITL release)
通过lock tablet10 in share row exclusive mode;命令添加SRX锁
通过lock tablet10 in exclusive mode命令添加X锁
语法:lock table in [row share][rowexclusive][share][share row exclusive][exclusive] mode;
各种TM锁的兼容性:
持有/得到
|
1-Null
|
2-SS(RS)
|
3-SX(RX)
|
4-S
|
5-SSX(SRX)
|
6-X
|
1-Null
|
√
|
√
|
√
|
√
|
√
|
√
|
2-SS(RS)
|
√
|
√
|
√
|
√
|
√
|
|
3-SX(RX)
|
√
|
√
|
√
|
|
|
|
4-S
|
√
|
√
|
|
√
|
|
|
5-SSX(SRX)
|
√
|
√
|
|
|
|
|
6-X
|
√
|
|
|
|
|
|
二、DDL锁
(省,单独讲)
三、Latch锁
(省,单独讲)
四、相关查询锁的语句
1、查询持有锁和请求锁的信息:v$lock
sys@OCM> selectsid,type,id1,id2,decode(lmode,0,'None',1,'Null',2,'Row share',3,'RowExclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive')lock_mode,decode(request,0,'None',1,'Null',2,'Row share',3,'RowExclusive',4,'Share',5,'Share
Row Exclusive',6,'Exclusive') request_mode,blockfrom v$lock where sid in(125,145);
SID TY ID1 ID2 LOCK_MODE REQUEST_MODE BLOCK
---------- -- ---------- ----------------------------- ------------------- ----------
125 AE 100 0 Share None 0
145 AE 100 0 Share None 0
145 TX 65539 2978 None Exclusive 0
145 TO 659081 Row Exclusive None 0
145 TM 74709 0 Row Exclusive None 0
125 TM 74709 0 Row Exclusive None 0
125 TX 65539 2978 Exclusive None
2、查询请求锁的信息:v$enqueue_lock
sys@OCM>select sid,type,decode(request,0,'None',1,'Null',2,'Row share',3,'RowExclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode fromv$enqueue_lock where sid in(125,145);
SID TY REQUEST_MODE
---------- -- -------------------
125 AE None
145 AE None
145 TX Exclusive
145 TO None
3、查询请求锁时间过长的信息
sys@OCM> select a.sidblocker_sid,a.serial#,a.username asblocker_username,b.type,decode(b.lmode,0,'None',1,'Null',2,'Row share',3,'RowExclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,b.ctimeas
time_held,c.sid as waiter_sid,decode(c.request,0,'None',1,'Null',2,'Rowshare',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive')request_mode,c.ctime time_waited fromv$lock b, v$enqueue_lock c, v$session a
2 where a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) andc.type(+) = 'TX' and b.type = 'TX'and b.block = 1
3 order by time_held,time_waited;
BLOCKER_SID SERIAL# BLOCKER_USERNAME TY LOCK_MODE TIME_HELD WAITER_SID REQUEST_MODE TIME_WAITED
----------- ---------------------------------------- -- ------------------- ---------- ----------------------------- -----------
125 9 GYJ TX Exclusive 605 145 Exclusive 476
把125号会话给KILL掉,操作命令如下:
alter system kill session '125,9';
五、死锁
1、两个session(以A和B来表示),如果A持有B正在申请的锁定,同时B也持有A正在申请的锁定时,这时发生死锁现象。
操作如下:
session A
update t1 set name='A1' where id=1;
session B
update t1 set name='B1' where id=2;
session A
update t1 set name='B2' where id=2;
session B
update t1 set name='A2' where id=1;
alter_<sid>.log
2、实际举个产生死锁的例子
步骤一:通过主外键创建班级代码表和学生基本信息表。
gyj@OCM> create table bjdmb(bjdm number(8) primary key,bjmc varchar2(20));
Table created.
gyj@OCM> create table xsjbxxb(xh number(10),xm varchar2(10),bjdm number(8),
2 foreign key(bjdm) references bjdmb(bjdm) on delete cascade,primary key(xh));
Table created.
步骤二:加载数据
gyj@OCM> insert into bjdmb values(01,'bj01');
1 row created.
gyj@OCM>insert into bjdmb values(02,'bj02');
1 row created.
gyj@OCM> insert into bjdmb values(03,'bj03');
1 row created.
gyj@OCM>insert into bjdmb values(04,'bj04');
1 row created.
gyj@OCM>commit;
Commit complete.
gyj@OCM> insert into xsjbxxb values(001,'tom',01);
1 row created.
gyj@OCM> insert into xsjbxxb values(002,'joe',02);
1 row created.
gyj@OCM> commit;
Commit complete.
步骤三:产生死锁
会话A,插入学生一条信息记录:
gyj@OCM>insert into xsjbxxb values(00,'joe',03);
1 row created.
会话B:删除4班信息
gyj@OCM> delete from bjdmb where bjdm=04;
会话B这时被阻塞了!!!!!
步骤四:回滚会话A和会话B
会话A回滚:
gyj@OCM> insert into xsjbxxbvalues(00,'joe',03);
1 row created.
gyj@OCM> rollback;
Rollback complete.
会话B回滚:
gyj@OCM> delete from bjdmb wherebjdm=04;
1 row deleted.
gyj@OCM> rollback;
Rollback complete.
步骤五:在外键上创建索引
gyj@OCM> create index idx_xsjbxxb_bjdm onxsjbxxb(bjdm);
Index created.
步骤六:然后重复执行步骤三的操作:
会话A上操作:
gyj@OCM> insert into xsjbxxbvalues(00,'joe',03);
1 row created.
会话B上操作:
gyj@OCM> delete from bjdmb wherebjdm=04;
1 row deleted.
没有被阻塞!!!!
死锁99%是外键上没加索引原因!!!!!!!!!!!!!
最后总结:外键要不需要加索引的情况
A)没有从交表删除行
B)没有更新父表的惟一键/主键值
C)没有从父表联结子表
**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name: guoyJoe
QQ: 252803295
Email: oracledba_cn@hotmail.com
Blog: http://blog.csdn.net/guoyJoe
ITPUB: http://www.itpub.net/space-uid-28460966.html
OCM: http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!
答案在:http://blog.csdn.net/guoyjoe/article/details/8624392
Oracle@Paradise 总群:127149411
Oracle@Paradise No.1群:177089463(已满)
Oracle@Paradise No.2群:121341761
Oracle@Paradise No.3群:140856036
分享到:
相关推荐
Oracle E-Business Suite 并发管理器详解 Oracle E-Business Suite 并发管理器是 Oracle E-Business Suite 中的一种异步处理机制,它可以将程序放到后台来运行,前台的操作还给用户,允许用户可以继续做其他业务。...
"复杂嵌入式系统中的并发管理" 在复杂的嵌入式系统中,并发管理是一个非常重要的主题。由于嵌入式系统中存在多个任务和线程,因此需要有效地管理这些任务和线程,以确保系统的可靠性和性能。以下是关于复杂嵌入式...
Oracle E-Business Suite (EBS) 的并发管理系统是其核心组件之一,主要处理异步任务,提高系统的资源利用率和用户体验。并发处理机制让程序在后台运行,用户可以在前台继续进行其他业务操作,降低了系统在特定时刻的...
本文将深入探讨WCF的并发管理,包括服务并发模式、实例模型与并发模型的关系以及限流策略。 首先,让我们来理解**WCF服务并发模式**。并发模式决定了服务在同一时间可以处理多少个客户端请求。WCF提供了两种主要的...
"EBS并发管理器学习指南" 本章节主要介绍了EBS并发管理器的学习指南,涵盖了并发管理器、打印机、报表、软字段、Oracle Alert以及Oracle Workflow等主题。这些主题都是OSS根据接收到的客户咨询电话总结出来的故障...
1. Internal Concurrent Manager(内部管理器):Internal Concurrent Manager 是一家企业的最高管理者,控制着其他所有的管理者,它的主要功能是启动和关闭个别的并发管理器,并在其他管理者出现故障时重置它们。...
Oracle E-Business Suite 并发管理器.doc Oracle E-Business Suite 并发管理器是 Oracle E-Business Suite 中的一种异步处理机制,它可以将程序放到后台来运行,前台的操作还给用户,允许用户可以继续做其他业务。...
标题中的“行业分类-设备装置-一种多媒体应用的并发管理方法和装置”表明这是一个关于信息技术领域,特别是设备装置部分,涉及到多媒体应用并发管理的技术方案。描述中的内容与标题相同,进一步确认了主题聚焦在...
。。ORAC1LE-EBS并发管理器.pdf
。。ORAC1LE-EBS并发管理器.docx
。。ORAC1LE-EBS并发管理系统器.pdf
在IT领域,特别是服务器端和分布式系统的设计与优化中,管理大批量并发处理是一项至关重要的任务。...同时,了解并运用好并发管理工具和技术,也能帮助我们编写出更加健壮、高效的代码,提升软件质量。
EBS(Enterprise Business Suite)是Oracle公司提供的一套全面的企业应用解决方案,旨在帮助企业管理财务、供应链、人力资源等核心业务流程。其中,“并发请求”是EBS系统中一个重要的功能模块,它允许用户在后台...
ALL 会清除所有相关数据,Manager 只清除并发管理器相关数据,而 Request 仅针对并发请求进行清理。 2. **模式**:有两种模式,"使用期限"和"计数"。"使用期限"保留最近的天数数据,"计数"则保留最近的记录条数。 ...
这适合WCF初学者自学,其中有相当基础的介绍,同时也有高级部分,像事务处理,安全管理,并发处理等
在现代数据库管理系统中,尤其是在SQL Server这样的企业级数据库系统中,并发管理是一个非常关键的话题。并发指的是多个事务或查询同时运行的情况,这可能导致一系列问题,比如数据不一致、死锁、更新冲突等。本文将...
线程并发管理涉及到多个方面,包括线程同步、死锁避免、线程间通信等。Java提供了多种机制来控制线程的并发行为,如`synchronized`关键字用于实现临界区保护,防止多个线程同时访问同一块资源;`wait()`, `notify()`...
Axios并发管理器 控制任何实例的并发请求。 使用axios拦截器实现 正在安装 $ npm install axios-concurrency 例子 const { ConcurrencyManager } = require ( "axios-concurrency" ) ; const axios = require ( ...
5. **并发管理(Concurrency Management)**:为了防止过多的并发连接耗尽资源,服务器需要一种机制来限制同时处理的请求数量。这可以通过线程池、信号量或异步队列来实现。 6. **错误处理和异常安全(Error ...