日期:2013-03-24 浏览次数:20569 次
本文通过对Oracle数据库锁机制的研讨,首先引见了Oracle数据库锁的品种,并描述了实际使用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及处理,并对死锁这一比较严重的景象,提出了相应的处理方法和具体的分析过程。
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的分歧性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修正。加了共享锁的数据对象可以被其他事务读取,但不能修正。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
在实际使用中经常会遇到的与锁相关的异常情况,如由于等待锁事务被挂起、死锁等景象,如果不能及时地处理,将严重影响使用的正常执行,而目前对于该类问题的处理缺乏系统化研讨和指点,本文在总结实际经验的基础上,提出了相应的处理方法和具体的分析过程。
Oracle数据库的锁类型
依据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,本文次要讨论DML锁。在Oracle数据库中,DML锁次要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。
在数据行上只要X锁(排他锁)。在 Oracle数据库中,当一个事务初次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待形状。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会惹起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些景象都会对实际使用产生极大的危害,如长时间未呼应,大量事务失败等。
TX锁等待的分析
在引见了有关地Oracle数据库锁的品种后,下面讨论如何无效地监控和处理锁等待景象,及在产生死锁时如何定位死锁的缘由。
监控锁的相关视图 数据字典是Oracle数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。和锁相关的数据字典视图如表2所示。
TX锁等待的监控和处理在日常任务中,如果发如今执行某条SQL时数据库长时间没有呼应,很可能是产生了TX锁等待的景象。为处理这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中缀事务。
死锁的监控和处理在数据库中,当两个或多个会话请求同一个资源时会产生死锁的景象。死锁的常见类型是行级锁死锁和页级锁死锁,Oracle数据库中普通使用行级锁。下面次要讨论行级锁的死锁景象。
当Oracle检测到死锁产生时,中缀并回滚死锁相关语句的执行,报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。
在日常任务中,如果发如今日志文件中记录了ora-00060的错误信息,则表明产生了死锁。这时需求找到对应的跟踪文件,依据跟踪文件的信息定位产生的缘由。
如果查询结果表明,死锁是由于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 |
3 | SX(Row-X) | 行级排它锁,在提交前不允许做DML操作 |
Insert、Update、Delete、Lock row share |
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
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|