Oracle数据库 *** 作中,我们有时会用到锁表查询以及解锁和kill进程等 *** 作,那么这些 *** 作是怎么实现的呢?本文我们主要就介绍一下这部分内容。
(1)锁表查询的代码有以下的形式:
select count() from v$locked_object;
select from v$locked_object;
(2)查看哪个表被锁
select bowner,bobject_name,asession_id,alocked_mode from v$locked_object a,dba_objects b where bobject_id = aobject_id;
(3)查看是哪个session引起的
select busername,bsid,bserial#,logon_time from v$locked_object a,v$session b where asession_id = bsid order by blogon_time;
(4)杀掉对应进程
执行命令:alter system kill session'1025,41';
其中1025为sid,41为serial#
我对文章中意向锁的理解 就是 对表的记录进行 *** 作之前 先对表定义(包括表结构 约束等)加了共享锁 这是为了避免对表的DDL *** 作
比如 当你往TAB 插入一条记录时 该表的一个字段COL 是允许为空的 插入这条记录的该字段的值是空的 此时 若不对该表定义加共享锁 则另外一SESSION对TAB COL 加非空约束 那该表结构修改就与插入的记录发生冲突了 所以 当执行DML *** 作是 必定对 *** 作的表加DDL共享锁
这是我理解的意向锁
文章中提及 记录行是无共享锁 我对此观点表示不同 当插入/修改子表时 对应的父表的主键记录应该被加共享锁 因为此时要保证父键的存在 经测试 当插入/修改/删除子表时 父表确实被加了SS锁 此时可以对父表的主键做插入动作 但不允许做修改/删除 这符合逻辑 因为插入 *** 作并不影响主外键的关系 但删除/修改则可能
SHARE VS ROW SHARE有什么区别?
我猜想 ROW SHARE是(级别= )对表加表定义共享锁 SHARE(级别= )是对表定义及表 所有 的记录加共享锁 但这样就有问题 SELECT FOR UPDATE产生TM= 对查询出来的记录产生TX= 的锁 那这样应该与 表 所有 的记录加共享锁 相冲突了?但实际并不是 实际上 当对表加SHARE锁时 还是可以对该表执行 SELECT FOR UPDATE 但却不可以执行DML *** 作!
现我只能这样理解 虽然产生了TX= 的事务锁 但实际上 还并没有真正修改记录 和真正的INSERT UPDATE DELETE *** 作还是有区别的 也就是 SELECT FOR UPDATE这个锁有点特别 对加了共享锁的记录 还可以SELECT FOR UPDATE 但若想执行DML语句 则不可以 因为该表的 所有 记录都加了共享锁
若照第 点的理解 那SRX就是对表加共享锁 对表的所有记录加排它锁 这是我的猜测 不知道在什么地方会使用上这种锁
总结 查看了ORACLE的文档 其并不解释如何定义的各级别的锁 为什么会这样定义 理由 用途何在?现在我想使用各类型锁 来对ORACLE锁的各级别定义说明
无
NULL 可以某些情况下 如分布式数据库的查询会产生此锁
SS 表结构共享锁
SX 表结构共享锁+ 作的记录的排它锁
S 表结构共享锁+所有记录共享锁
SRX 表结构共享锁+所有记录排它锁
X 表结构排它锁+所有记录排它锁
lishixinzhi/Article/program/Oracle/201311/18652
锁是
数据库保护数据表的一种机制,通常是自动的,分级别的,如果你访问一个表的并发量太大,可以试试拆分这个表,比如按日期拆分成月表,或者利用oracle的功能(分区)进行拆分来分散压力,如果没有依据拆分的话,可以做成实体化快照,将一些查询类的 *** 作指向这个快照,分摊表的访问量,也可以通过提升硬件,比如上SSD磁盘,然后将这个表放到这个磁盘上,提高访问速度。
ORACLE数据库是现今数据库领域应用最广泛的 同时它也是一个庞大的系统 全面了解它 玩转它不但需要一定的理论知识 更需要开发经验与工程经验 本人是ORACLE一爱好者 以下是本人对ORACLE锁的一些经验 希望能与大家共同分享 预备知识 DDL(DATABASE DEFINITION LANGUAGE) 数据库定义语言 如create table drop table DML(DATABASE MODIFICATION LANGUAGE):数据库修改语言 如insert delete update 参考资料 Oracle Administrator s Guide Release Oracle Tuning Release ORACLE锁具体分为以下几类 按用户与系统划分 可以分为自动锁与显示锁自动锁 当进行一项数据库 *** 作时 缺省情况下 系统自动为此数据库 *** 作获得所有有必要的锁 显示锁 某些情况下 需要用户显示的锁定数据库 *** 作要用到的数据 才能使数据库 *** 作执行得更好 显示锁是用户为数据库对象设定的 按锁级别划分 可分为共享锁与排它锁共享锁 共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁 共享锁为事务提供高并发性 但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失 排它锁 事务设置排它锁后 该事务单独获得此资源 另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁 按 *** 作划分 可分为DML锁 DDL锁+DML锁又可以分为 行锁 表锁 死锁 行锁 当事务执行数据库插入 更新 删除 *** 作时 该事务自动获得 *** 作表中 *** 作行的排它锁 表级锁 当事务获得行锁后 此事务也将自动获得该行的表锁(共享锁) 以防止其它事务进行DDL语句影响记录行的更新 事务也可以在进行过程中获得共享锁或排它锁 只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时 事务才会获得表上的排它锁 也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档) 死锁 当两个事务需要一组有冲突的锁 而不能将事务继续下去的话 就出现死锁 如事务 在表A行记录# 中有一排它锁 并等待事务 在表A中记录# 中排它锁的释放 而事务 在表A记录行# 中有一排它锁 并等待事务; 在表A中记录# 中排它锁的释放 事务 与事务 彼此等待 因此就造成了死锁 死锁一般是因拙劣的事务设计而产生 死锁只能使用SQL下:alter system kill session sid serial# 或者使用相关 *** 作系统kill进程的命令 如UNIX下kill sid 或者使用其它工具杀掉死锁进程 +DDL锁又可以分为 排它DDL锁 共享DDL锁 分析锁 排它DDL锁 创建 修改 删除一个数据库对象的DDL语句获得 *** 作对象的 排它锁 如使用alter table语句时 为了维护数据的完成性 一致性 合法性 该事务获得一排它DDL锁 共享DDL锁 需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁 如创建一个包 该包中的过程与函数引用了不同的数据库表 当编译此包时 该事务就获得了引用表的共享DDL锁 分析锁 ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序 使运行相同语句的应用速度更快 一个在共享池中缓存的对象获得它所引用数据库对象的分析锁 分析锁是一种独特的DDL锁类型 ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系 当一个事务修改或删除了共享池持有分析锁的数据库对象时 ORACLE使共享池中的对象作废 下次在引用这条SQL/PLSQL语句时 ORACLE重新分析编译此语句 内部闩锁内部闩锁 这是ORACLE中的一种特殊锁 用于顺序访问内部系统结构 当事务需向缓冲区写入信息时 为了使用此块内存区域 ORACLE首先必须取得这块内存区域的闩锁 才能向此块内存写入信息 以上是 本人对ORACLE锁的一些总结 不足之处还望大家海涵 同时也希望大家多提出自己对ORACLE锁的一些看法 lishixinzhi/Article/program/Oracle/201311/16769
1 引言—数据库锁的基本概念
为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。
排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。
共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
2 Oracle 多粒度封锁机制介绍
根据保护对象的不同,Oracle数据库锁可以分为以下几大类:
(1) DML lock(data locks,数据锁):用于保护数据的完整性;
(2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);
(3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构;
(4) distributed locks(分布式锁):用于OPS(并行服务器)中;
(5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。
本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。
21 Oracle的TX锁(行级锁、事务锁)
许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK *** 作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。
22 TM锁(表级锁)
221 意向锁的引出
表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。
222 意向锁的类型
由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:
意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;
意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。
另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的“=”指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。
这样我们又可以引入一种新的锁的类型
共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁) :如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。
这样数据库对象上所加的锁类型就可能有5种:即S、X、IS、IX、SIX。
具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。
oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看。
一、数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、oracle死锁的原理
当对于数据库某个表的某一列做更新或删除等 *** 作,执行完毕后该条语句不提交,另一条对于这一列数据做更新 *** 作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、oracle死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句
以下是代码片段:
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。
以下是代码片段:
以上就是关于查看oracle是否锁表全部的内容,包括:查看oracle是否锁表、我对ORACLE数据锁的一点体会、oracle数据库访问中要控制加锁怎样实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)