`
wsql
  • 浏览: 12098071 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

并发管理

 
阅读更多

一、Oracle的锁

锁是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间“相互干涉”的核心机制。

1、锁的类型

1DML锁:允许并发执行数据修改,特定数据行上的锁或表中的所有行的锁。

2DDL锁:保护对象结构定义。

3Latch锁:这是Oracle内部锁,用来协调对期共享数据结构的访问。

2LOCK锁的模式

1)空锁(NULL)

2)排它锁(X)

3)共享锁(S)

二、DML

1TX锁:修改数据的事务在执行期间会获得这种锁。

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 - none1 - 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

2TM锁:表级锁

TM锁的主要作用,在DML期间,防止对表的DDL操作,可以确保对象的结构不被修改,例如,如果你已经更新了一个表,会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROPALTER命令。如果你有表的一个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表示被锁定的对象的对象IDID2始终为0

TM锁的模式:

代码

锁模式

0-None

没有锁

1-Null

空锁

2-SSRS

行级共享锁。Row Share

共享

3-SXRX

行级排它锁。Row Exclusive

排他

4-S

表共享锁Share

共享

5-SSXSRX

表共享行排它锁。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-SSRS

3-SXRX

4-S

5-SSXSRX

6-X

1-Null

2-SSRS

3-SXRX

4-S

5-SSXSRX

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(以AB来表示),如果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-EBS并发管理器[整理].pdf

    Oracle E-Business Suite 并发管理器详解 Oracle E-Business Suite 并发管理器是 Oracle E-Business Suite 中的一种异步处理机制,它可以将程序放到后台来运行,前台的操作还给用户,允许用户可以继续做其他业务。...

    复杂的嵌入式系统中的并发管理

    "复杂嵌入式系统中的并发管理" 在复杂的嵌入式系统中,并发管理是一个非常重要的主题。由于嵌入式系统中存在多个任务和线程,因此需要有效地管理这些任务和线程,以确保系统的可靠性和性能。以下是关于复杂嵌入式...

    ORACLE-EBS并发管理系统器.docx

    Oracle E-Business Suite (EBS) 的并发管理系统是其核心组件之一,主要处理异步任务,提高系统的资源利用率和用户体验。并发处理机制让程序在后台运行,用户可以在前台继续进行其他业务操作,降低了系统在特定时刻的...

    《WCF按部就班学习系列8_WCF并发管理概述》

    本文将深入探讨WCF的并发管理,包括服务并发模式、实例模型与并发模型的关系以及限流策略。 首先,让我们来理解**WCF服务并发模式**。并发模式决定了服务在同一时间可以处理多少个客户端请求。WCF提供了两种主要的...

    学习EBS并发管理器.pdf

    "EBS并发管理器学习指南" 本章节主要介绍了EBS并发管理器的学习指南,涵盖了并发管理器、打印机、报表、软字段、Oracle Alert以及Oracle Workflow等主题。这些主题都是OSS根据接收到的客户咨询电话总结出来的故障...

    ORACLE-EBS并发管理器.doc

    1. Internal Concurrent Manager(内部管理器):Internal Concurrent Manager 是一家企业的最高管理者,控制着其他所有的管理者,它的主要功能是启动和关闭个别的并发管理器,并在其他管理者出现故障时重置它们。...

    ORACLE_EBS并发管理器.doc

    Oracle E-Business Suite 并发管理器.doc Oracle E-Business Suite 并发管理器是 Oracle E-Business Suite 中的一种异步处理机制,它可以将程序放到后台来运行,前台的操作还给用户,允许用户可以继续做其他业务。...

    行业分类-设备装置-一种多媒体应用的并发管理方法和装置.zip

    标题中的“行业分类-设备装置-一种多媒体应用的并发管理方法和装置”表明这是一个关于信息技术领域,特别是设备装置部分,涉及到多媒体应用并发管理的技术方案。描述中的内容与标题相同,进一步确认了主题聚焦在...

    ORAC1LE-EBS并发管理器.pdf

    。。ORAC1LE-EBS并发管理器.pdf

    ORAC1LE-EBS并发管理器.docx

    。。ORAC1LE-EBS并发管理器.docx

    ORAC1LE-EBS并发管理系统器.pdf

    。。ORAC1LE-EBS并发管理系统器.pdf

    管理大批量并发处理.zip

    在IT领域,特别是服务器端和分布式系统的设计与优化中,管理大批量并发处理是一项至关重要的任务。...同时,了解并运用好并发管理工具和技术,也能帮助我们编写出更加健壮、高效的代码,提升软件质量。

    EBS并发请求

    EBS(Enterprise Business Suite)是Oracle公司提供的一套全面的企业应用解决方案,旨在帮助企业管理财务、供应链、人力资源等核心业务流程。其中,“并发请求”是EBS系统中一个重要的功能模块,它允许用户在后台...

    清除并发请求和(或)管理器数据

    ALL 会清除所有相关数据,Manager 只清除并发管理器相关数据,而 Request 仅针对并发请求进行清理。 2. **模式**:有两种模式,"使用期限"和"计数"。"使用期限"保留最近的天数数据,"计数"则保留最近的记录条数。 ...

    WCF编程详细介绍,包括事务,并发管理

    这适合WCF初学者自学,其中有相当基础的介绍,同时也有高级部分,像事务处理,安全管理,并发处理等

    sqlserver并发分析及解决办法

    在现代数据库管理系统中,尤其是在SQL Server这样的企业级数据库系统中,并发管理是一个非常关键的话题。并发指的是多个事务或查询同时运行的情况,这可能导致一系列问题,比如数据不一致、死锁、更新冲突等。本文将...

    多线程并发的demo

    线程并发管理涉及到多个方面,包括线程同步、死锁避免、线程间通信等。Java提供了多种机制来控制线程的并发行为,如`synchronized`关键字用于实现临界区保护,防止多个线程同时访问同一块资源;`wait()`, `notify()`...

    axios-concurrency:Axios的并发管理器。 控制axios实例同时发出的请求数量。 对处理速率限制很有用。 使用拦截器实现

    Axios并发管理器 控制任何实例的并发请求。 使用axios拦截器实现 正在安装 $ npm install axios-concurrency 例子 const { ConcurrencyManager } = require ( "axios-concurrency" ) ; const axios = require ( ...

    C#版支持高并发的HTTP服务器源码

    5. **并发管理(Concurrency Management)**:为了防止过多的并发连接耗尽资源,服务器需要一种机制来限制同时处理的请求数量。这可以通过线程池、信号量或异步队列来实现。 6. **错误处理和异常安全(Error ...

Global site tag (gtag.js) - Google Analytics