介绍了Oracle数据库锁的种类及研究

本文通过对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 、Lock exclusive

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

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

row_wait_obj#:表示等待的对象。

和dba_objects中的object_id相对应。

v$session_wait 查询等待的会话信息。
sid:表示持有锁的会话信息。

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

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

v$lock 列出系统中的所有的锁。
Sid:表示持有锁的会话信息。

Type:表示锁的类型。值包括TM和TX等。

ID1:表示锁的对象标识。

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

息。用数字0-6表示,和表1相对应。

dba_locks 对v$lock的格式化视图。
Session_id:和v$lock中的Sid对应。

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

Lock_ID1: 和v$lock中的ID1对应。

Mode_held,mode_requested:和v$lock中

的lmode,request相对应。

v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。
Xidusn,xidslot,xidsqn:表示回滚段信息。和

v$transaction相关联。

Object_id:表示被锁对象标识。

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

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

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

时间: 2024-09-17 12:58:44

介绍了Oracle数据库锁的种类及研究的相关文章

oracle 数据库锁类型 TM锁和TX锁

问题描述 oracle 数据库锁类型 TM锁和TX锁 oracle 9i 10g 编程艺术书中对oracle 的锁类型有三种分类:DML锁,DDL 锁 以及 内部锁和闩 针对DML 锁并没有详细的介绍,只说明有TM(表)锁 和TX(行)锁 网上搜索了很多资料,在资料中有具体的分类 问题是:表头说这些锁都是TM锁... 但是我怎么感觉2,3 都属于TX锁呢?2,3 到底是TM 锁还是 TX 锁呢? 解决方案 TX锁和TM锁不是互斥的,DML 锁 先由TM锁获取表级锁,然后TX 在对具体行修改. 这

Oracle数据库锁表及解锁进程

下午代码迁移,更新数据库记录时for update语句无法执行,数据库被锁,KILL掉几个进程搞定. Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?简要介绍一下. 锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object; 查看哪个表被锁 select b.owner,b.object_name,a.session_id,a.lo

对Oracle数据库性能优化技术的研究

大型关系数据库Oracle已经广泛应用于各行各业,如政府.交通.公安.电信.金融.能源等部门,并已逐渐成为企业信息化建设的重要数据库平台,但随着 Oracle 数据库规模的扩大,数据库用户人数的增加,数据库性能问题越来越突出,因此,有必要对 Oracle 数据库性能进行调整与优化, 使之在满足需求条件下,系统性能达到最佳和系统开销最小. 1.性能优化目标 1.1 缩短响应时间 响应时间是指从用户提交SQL语句到数据库返回结果集的第一行数据所需要的时间,缩短响应时间可以通过减小系统服务时间或用户等

Oracle数据库中临时表的深入研究

oracle|临时表|数据|数据库 最近考虑到我们的数据库端写存储过程关于临时表使用的情况,由于我们现在还不清楚数据库端到底是怎么处理的,是否和Sql Server的处理方式相同,是否会存在隐患等等一些问题,为了避免将来不必要的麻烦我做了深入的研究和查看了一些权威的资料,现在和大家共享,希望大家在处理 Oracle临时表是注意一下: 首先是创建临时表的语法: CREATE GLOBAL TEMPORARY TABLE table "(" column datatype [DEFAULT

Oracle数据库备份策略的相关概念及使用

这篇论坛文章主要介绍了Oracle数据库备份策略的相关概念及使用中的注意事项,详细内容请大家参考下文 一.了解备份的重要性 可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片.主板电路.内存.电源等任何一项不能正常工作,都会导致计算机系统不能正常工作.当然,这些损坏可以修复,不会导致应用和数据的损坏.但是,如果计算机的硬盘损坏,将会导致数据丢失,此时必须用备份恢复数据. 其实,在我们的现实

oracle数据库如何重建索引

  当索引的碎片过多时,会影响执行查询的速度,从而影响到我们的工作效率.这时候采取的最有利的措施莫过于重建索引了.本文主要介绍了Oracle数据库中检查索引碎片并重建索引的过程,接下来我们就开始介绍这一过程. 重建索引的步骤如下: 1. 确认基本信息 登入数据库,找到专门存放index 的tablespace,并且这个tablespace下所有index的owner都是tax.将index专门存放在一个独立的tablespace, 与数据表的tablespace分离,是常用的数据库设计方法. 2

oracle 数据库隔离级别学习_oracle

oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争. 不可重复读(Nonrepeatable reads) 同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读. 幻读(Phantom reads) 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读. 数据库操作的隔离级别 未提交读

oracle数据库如何打补丁

给软件打补丁相当于给人打预防针,对系统的稳定运行至关重要.本文详细.系统地介绍了Oracle数据库补丁的分类.安装.管理等问题. 厂商提供给用户的软件补丁的形式多为编译后的库函数,所以安装软件补丁实际上就是把这些库函数拷贝到相应目录,并在需要时进行联接操作.软件公司一般在一段时间后会把针对某一版本的所有补丁进行整理:合并融合,解决冲突,进行整体测试,并使文件拷贝和联接操作自动执行,得到一个软件补丁"包 ".不同的公司使用不同的名称,现在一般计算机用户都熟悉的Windows Servic

Oracle数据库的十种重新启动步骤

本文详细的介绍了Oracle数据库较好的十种重新启动步骤. 1. 停应用层的各种程序. 2. 停oralce的监听进程: $lsnrctl stop 3. 在独占的系统用户下,备份控制文件: SQL>alter database backup controlfile to trace; 4. 在独占的系统用户下,手工切换重作日志文件,确保当前已修改过的数据存入文件: SQL>alter system switch logfile; 5. 在独占的系统用户下,运行下面SQL语句,生成杀数据库用户