网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > 开发技术 > Oracle数据库中的锁机制研究-开发技术  

Oracle数据库中的锁机制研究-开发技术

2008-03-12  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

    本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决,并对死锁这一比较严重的现象,提出了相应的解决方法和具体的分析过程。

网管网www_bitscn_com

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

网管联盟bitsCN@com

    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 网管下载dl.bitscn.com

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

中国网管论坛bbs.bitsCN.com

    在实际应用中经常会遇到的与锁相关的异常情况,如由于等待锁事务被挂起、死锁等现象,如果不能及时地解决,将严重影响应用的正常执行,而目前对于该类问题的解决缺乏系统化研究和指导,本文在总结实际经验的基础上,提出了相应的解决方法和具体的分析过程。 中国网管联盟bitsCN.com

    Oracle数据库的锁类型 网管u家u.bitscn@com

    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。 网管u家u.bitscn@com

    DML锁的目的在于保证并发情况下的数据完整性,本文主要讨论DML锁。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 网管u家u.bitsCN.com

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

    在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

网管bitscn_com

    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

网管下载dl.bitscn.com

    TX锁等待的分析 网管联盟bitsCN_com

    在介绍了有关地Oracle数据库锁的种类后,下面讨论如何有效地监控和解决锁等待现象,及在产生死锁时如何定位死锁的原因。

网管u家u.bitsCN.com

    监控锁的相关视图 数据字典是Oracle数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。和锁相关的数据字典视图如表2所示。

中国网管论坛bbs.bitsCN.com

    TX锁等待的监控和解决在日常工作中,如果发现在执行某条SQL时数据库长时间没有响应,很可能是产生了TX锁等待的现象。为解决这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中断事务。 网管u家u.bitscn@com

    死锁的监控和解决在数据库中,当两个或多个会话请求同一个资源时会产生死锁的现象。死锁的常见类型是行级锁死锁和页级锁死锁,Oracle数据库中一般使用行级锁。下面主要讨论行级锁的死锁现象。 网管下载dl.bitscn.com

    当Oracle检测到死锁产生时,中断并回滚死锁相关语句的执行,报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。 网管论坛bbs_bitsCN_com

    在日常工作中,如果发现在日志文件中记录了ora-00060的错误信息,则表明产生了死锁。这时需要找到对应的跟踪文件,根据跟踪文件的信息定位产生的原因。

中国网管论坛bbs.bitsCN.com

    如果查询结果表明,死锁是由于bitmap索引引起的,将IND_T_PRODUCT_HIS_STATE索引改为normal索引后,即可解决死锁的问题。
    
   

表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none    
1 NULL Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行

Select for update、Lock for update、Lock row share

中国网管联盟bitsCN.com

3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作

Insert、Update、Delete、Lock row share

中国网管论坛bbs.bitsCN.com

4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁

Alter table、Drop able、Drop index、Truncate table 、Lock exclusive 网管联盟bitsCN_com


    
   
表2 数据字典视图说明
视图名 描述 主要字段说明
v$session 查询会话的信息和锁的信息。

sid,serial#:表示会话信息。 网管u家u.bitsCN.com

program:表示会话的应用程序信息。 网管网www_bitscn_com

row_wait_obj#:表示等待的对象。 网管网www.bitscn.com

和dba_objects中的object_id相对应。

网管联盟bitsCN@com

v$session_wait 查询等待的会话信息。

sid:表示持有锁的会话信息。

网管论坛bbs_bitsCN_com

Seconds_in_wait:表示等待持续的时间信息

网管下载dl.bitscn.com

Event:表示会话等待的事件。

网管论坛bbs_bitsCN_com

v$lock 列出系统中的所有的锁。

Sid:表示持有锁的会话信息。

网管联盟bitsCN@com

Type:表示锁的类型。值包括TM和TX等。 网管网www.bitscn.com

ID1:表示锁的对象标识。 网管bitscn_com

lmode,request:表示会话等待的锁模式的信 网管bitscn_com

息。用数字0-6表示,和表1相对应。 网管论坛bbs_bitsCN_com

dba_locks 对v$lock的格式化视图。

Session_id:和v$lock中的Sid对应。 中国网管联盟bitsCN.com

Lock_type:和v$lock中的type对应。

网管网www.bitscn.com

Lock_ID1: 和v$lock中的ID1对应。 网管论坛bbs_bitsCN_com

Mode_held,mode_requested:和v$lock中 中国网管联盟bitsCN.com

的lmode,request相对应。 网管论坛bbs_bitsCN_com

v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。

Xidusn,xidslot,xidsqn:表示回滚段信息。和

网管bitscn_com

v$transaction相关联。 网管论坛bbs_bitsCN_com

Object_id:表示被锁对象标识。

中国网管论坛bbs.bitsCN.com

Session_id:表示持有锁的会话信息。

网管联盟bitsCN_com

Locked_mode:表示会话等待的锁模式的信

网管u家u.bitscn@com

息,和v$lock中的lmode一致。

网管论坛bbs_bitsCN_com

    
   

网管bitscn_com


TAGs   研究   机制   数据库       事务   会话   数据   表示   信息   等待      
 上一篇:没有了   下一篇:测量磁盘I/O-开发技术
Oracle数据库中的锁机制研究-开发技术 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: