数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle数据库锁的常用类型有哪些


发布日期:2021年07月07日
 
Oracle数据库锁的常用类型有哪些

此文章主要是对Oracle数据库锁机制的详细研究首先我们要介绍的是Oracle数据库锁的类型同时也阐述在实际应用中我们经常会遇到的与锁相关的异常情况特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决并对死锁这一比较严重的现象提出了相应的解决方法和具体的分析过程

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

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

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

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

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锁包括了SSSXSX等多种模式在Oracle数据库中用来表示不同的SQL操作产生不同类型的TM锁如表所示

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

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

TX锁等待的分析

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

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

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

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

当Oracle检测到死锁产生时中断并回滚死锁相关语句的执行报ORA的错误并记录在Oracle数据库的日志文件alertSIDlog中同时在user_dump_dest下产生了一个跟蹤文件详细描述死锁的相关信息

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

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

Oracle的TM锁类型

锁模式 锁描述 解释 SQL操作

none

NULL 空 Select

SS(RowS) 行级共享锁其他对象只能查询这些数据行 Select for updateLock for updateLock row share

SX(RowX) 行级排它锁在提交前不允许做DML操作 InsertUpdateDeleteLock row share

S(Share) 共享锁 Create indexLock share

SSX(S/RowX) 共享行级排它锁 Lock share row exclusive

X(Exclusive) 排它锁 Alter tableDrop ableDrop indexTruncate table Lock exclusive

上一篇:Oracle中操作系统优化和使用资源管理器

下一篇:oracle10gias在aix5l安装纪实