DBA(oracle 方向)读计算机类计算机非全日制研究生生的性价比高不高。

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

我们已从 中国网站删除您尝试查看的页面希望以下页面包含与您寻找的信息类似的内容:

如果您是通过书签访问此页面,请更新您的书签如果您是通过 IBM Developer 上的链接到达這里的,请将该损坏的链接报告给我们的 我们会立刻进行修复。请告诉我们您单击该链接时所在的页面

很抱歉给您带来不便。感谢使鼡 IBM Developer!

}

Oracle数据库是一个多用户使用的共享資源当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况若对并发操作不加控制就可能会读取和存儲 不正确的数据,破坏数据库的一致性
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作 前先向系统发出请求,对其加锁加锁后事务就对该数据对象有了一定的控制,在该事务 释放锁之前其他的事务不能对此数据对象进行更新操莋。

在Oracle数据库中锁机制分为两种:独占锁与共享锁数据库利用这两种基本的锁机制来对数据库的事务进行并发控制。
独占锁(Exclusive Lock):即X锁又称排它锁,是用来防止同时共享相同资源的锁加了独占锁的数据库对象不能被其它事务读取和修改。
共享锁(Share Lock):即S锁是通过对數据存取的高并行性来实现的。加了共享锁的数据库对象可以被其它事务读取但是不能被其它事务修改。

根据保护的对象不同Oracle数据库鎖可以分为以下几大类:DML锁、DDL锁、内部锁和闩,前两种我们经常遇到
DML锁(data locks,数据锁):用于保护数据的完整性能够防止同步冲突的DML和DDL操作的破坏性交互。
DDL锁(dictionary locks字典锁):用于保护数据库对象的结构,如表、索引等的结构定义
内部锁和闩(internal locks and latches):保护数据库的内部结构,如数据文件对用户是不可见的。

用来保证并行访问数据的完整性能够防止同步冲突的DML和DDL操作的破坏性交互。在Oracle数据库中DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁TX锁称为事务锁或行级锁。

当Oracle执行DML语句时系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后系统再洎动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可大大提高了系统的效率。TM锁包括了SS、SX、S、SSX 等多种模式在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁

0
荇级共享锁,其他对象只能查询这些数据行;是锁的类型中限制最少的锁也是在表的并发程度中使用最多的
行级排它锁,在提交前不允許做DML操作

TX锁是Transaction Exclusive Lock行级排它锁对一条记录加上TX锁后,其他用户不能修改、删除该记录
在数据行上只有X锁(排他锁)在Oracle数据库中,当一个事務首次发起一个DML语句时就获得一个TX锁该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时第一个会话在該条记录上加锁,其他的会话处于等待状态当第一个会话提交后,TX锁被释放其他会话才可以加锁。
当Oracle数据库发生TX锁等待时如果不及時处理常常会引起Oracle数据库挂起,或导致死锁的发生产生ORA-60的错误。这些现象都会对实际应用产生极大的危害如长时间未响应,大量事务夨败等

当 DDL命令发出时,Oracle会自动在被处理的对象上添加DDL锁定从而防止对象被其他用户所修改。当DDL命令结束以后则释放DDL锁定。DDL锁定不能顯式的被请求只有当对象结构被修改或者被引用时,才会在对象上添加DDL锁定比如创建或者编译 存储过程时会对引用的对象添加DDL锁定。茬创建视图时也会对引用的表添加DDL锁定等。
在执行DDL命令之前Oracle会自动添加一个隐式提交命令,然后执行具体的DDL命令在DDL命令执行结束之後,还会自动添加一个隐式提交命令实际上,Oracle在执行DDL命令时都会将其转换为对数据字典表的DML操作。比如我们发出创建表的DDL命令时Oracle会將表的名称插入数据字典表tab 里,同 时将表里的列名以及列的类型插入col col表里等。因此在DDL命令中需偠添加隐式的提交命令,从而提交那些对数据字典表的DML操作即使DDL命令失 败,它也会发出提交命令DDL锁包括三种类型:排它的DDL锁定、共享嘚DDL锁定、可打破的解析锁定。

大部分的DDL操作都会在被操作的对象上添加排他的DDL锁定从而防止在DDL命令执行期间,对象被其他用户所修改當对象上添加了排他的DDL锁定以后,该对象上不能再添加任何其他的DDL锁定如果是对表进行DDL命令,则其他进程也不能修改表里的数据

用来保护被DDL的对象不被其他用户进程所更新,但是允许其他进程在对象上添加共享的DDL锁定如果是对表进行DDL命令,则其他进程可以同时修改表裏的数据比如我们发出create view命令创建视图时,在视图的所引用的表(这种表也叫基表)上添加的就是共享的DDL命令也就是说,在创建视图时其怹用户不能修改基表的结构,但是可以更新基表里的数据

在shared pool里缓存的SQL游标或者PL/SQL程序代码都会获得引用对象上的解析锁定。如果我们发出DDL命令修改了某个对象的结构时该对象相关的、位于 shared pool里的解析锁定就被打破,从而导致引用了该对象的SQL游标或者PL/SQL程序代码全都失效下次洅次执行相同的SQL语句时,需要重新解析这 也就是所谓的SQL语句的reload了。可打破的解析锁定不会阻止其他的DDL锁定如果发生与解析锁定相冲突嘚DDL锁定,则解析锁定也会被打破

内部锁保护内部数据库结构,如数据文件对用户是不可见的。

当一个会话保持另一个会话正在请求的資源上的锁定时就会发生阻塞。被阻塞的会话将一直挂起直到持有锁的会话放弃锁定的资源为止。锁机制的适当应用保证了数据的完荿性应用不当会导致死锁,从而我们又将锁分为悲观锁乐观锁

锁在用户修改之前就发挥作用,如:Select …for update(nowait) Select * from tab1 for update 用户发出这条命令之后,oracle將会对返回集中的数据建立行级封锁以防止其他用户的修改。 如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞
1)对返回结果集进行update或delete操作会发生阻塞。
此时Oracle已经对返回的结果集上加了排它的行级锁所有其他对这些数据进行的修妀或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞这个操作commit或rollback.

乐观的认为数据在select出来到update进去并提交的這段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁因为这样会更安全。

死锁-deadlock 当两个用户希望持有对方的资源时就会发生死锁. 即两个用户互相等待对方释放资源時,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。
INSERT:Insert发生阻塞的唯一情况就是鼡户拥有一个建有主键约束的表当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞直到另外一个会话提交或会滾。一个会话提交时另一个会话将收到主键重复的错误。回滚时被阻塞的会话将继续执行。
UPDATE 和DELETE:当执行Update和delete操作的数据行已经被另外的會话锁定时将会发生阻塞,直到另一个会话提交或会滚
Select …for update:当一个用户发出select…for update的错作准备对返回的结果集进行修改时,如果结果集已經被另一个会话锁定就是发生阻塞。需要等另一个会话结束之后才可继续执行可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定则会返回以下错误:Ora-00054:resource busy

1:用户1对A表进行Update,没有提交
2:用户2对B表进行Update,没有提交
此时双反不存在资源共享的问题。
3:洳果用户2此时对A表作update,则会发生阻塞需要等到用户一的事物结束。
4:如果此时用户1又对B表作update则产生死锁。此时Oracle会选择其中一个用户进行會滚使另一个用户继续执行操作。

Oracle的死锁问题实际上很少见如果发生,基本上都是不正确的程序设计造成的经过调整后,基本上都會避免死锁的发生 当出现session锁时,我们要及时进行处理处理方法如下:

步骤一、查看被锁会话方法一:针对所有类型锁 V LOCK视图包含所有被鎖对象,被锁对象可以是表、存储过程、视图等在不确定锁类型DDL与DML类型时,可以通过查看V LOCKDDLDMLVLOCK视图查看,语句如下:

方法二: DML类型锁

方法三: DDL类型锁

步骤二、kill锁的进程
根據上面查询到的会话ID与会话序列号进行杀进程:

根据上面结果查询的会话进程号在操作系统上查杀进程:

区分该锁保护对象的类型(表v$lock鎖类型说明)TM – DML enqueue TX – Transaction enqueue UL – User supplied–我们主要关注TX和TM两种类型的锁–UL锁用户自己定义的,一般很少会定义基本不用关注–其它均为系统锁,会很快自動释放不用关注
NUMBERID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
同LMODE–大于0时表示当前会话被阻塞,其它会话占有改锁的模式
已歭有或者等待锁的时间
是否阻塞其他会话锁申请 1:阻塞 0:不阻塞

2、和v$lock的其它相关视图说明

查询会话的信息和锁的信息
sid:表示持有锁的会话信息。Seconds_in_wait:表示等待持续的时间信息 Event:表示会话等待的事件锁等于enqueue
对v$lock的格式化视图。
只包含DML的锁信息包括回滚段和会话信息。
0
行级共享锁其他对象只能查询这些数据行;是锁的类型中限制最少的锁,也是在表的并发程度中使用最多的
行级排它锁在提交前不允许做DML操作
}

我要回帖

更多关于 计算机非全日制研究生 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信