当前位置:  数据库>oracle
本页文章导读:
    ▪[转] 深入浅出oracle锁---原理篇      深入浅出oracle锁---原理篇 在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据.........
    ▪[转] ORACLE 错误编号表一      ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它.........
    ▪[转] 执行commit时oracle做哪些工作      COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,在数据库中已经执行了数据更改,所以已经完成了99%的任务。例如:下列操作已经产生: 1.在SGA(Buffer Cache).........

[1][转] 深入浅出oracle锁---原理篇
    来源:    发布时间: 2013-10-29
深入浅出oracle锁---原理篇
 
在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select 利用的是undo中的前镜像数据了)。

Oracle锁的分类

Oracle锁基本上可以分为二类
a:共享锁(share locks)  也称读锁,s锁
b:排它锁 (exclusive locks) 也称写锁,x锁

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

按锁保护的内容分类

oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为
a:dml锁,data locks 数据锁,用来保护数据的完整性和一致性
b:ddl 锁,dictionary locks 字典锁,用来保护数据对象的结构,如table,index的定义
c:内部锁和闩 internal locks and latchs 用来保护数据库内部结构,如sga内存结构

DML锁:

DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。当Oracle执行delete,update,insert,select for update  DML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位(lb 即lock bytes)进行置位。

在记录被某一会话锁定后,其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。

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

在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。

和锁相关的性能视图介绍:

v$lock
SID             会话的sid,可以和v$session 关联   
TYPE           区分该锁保护对象的类型,如tm,tx,rt,mr等
ID1             锁表示1,详细见下说明                
ID2             锁表示2,详细见下说明           
LMODE        锁模式,见下面说明             
REQUEST    申请的锁模式,同lmode                 
CTIME        已持有或者等待锁的时间                
BLOCK        是否阻塞其他会话锁申请 1:阻塞 0:不阻塞  

LMODE        取值0,1,2,3,4,5,6, 数字越大锁级别越高, 影响的操作越多。
1级锁:
Select,有时会在v$locked_object出现。

2级,即RS锁:
相应的sql有:Select for update ,Lock xxx in  Row Share mode,select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。

3级锁,即RX锁:
相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

4级锁,即S锁:
相应的sql有:Create Index, Lock xxx in Share mode

5级锁,即SRX锁:
相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update/delete ... ; 可能会产生4,5的锁。

6级锁,即X锁:
相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive mode

ID1,ID2的取值含义根据type的取值而有所不同

对于TM 锁
ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0

对于TX 锁
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:  0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
                                             
v$locked_object
XIDUSN                      undo segment number , 可以和v$transaction关联    
XIDSLOT                     undo slot number      
XIDSQN                      序列号                         
OBJECT_ID                 被锁定对象的object_id ,   可以和dba_objects关联
SESSION_ID               持有该锁的session_id,     可以和v$session关联
ORACLE_USERNAME   持有该锁的oracle帐号                     
OS_USER_NAME         持有该锁的操作系统帐号                      
PROCESS                   操作系统的进程号,可以和v$process关联      
LOCKED_MODE          锁模式,含义同v$lock.lmode

dba_locks 和v$lock 内容差不多,略

V$session 如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息
ROW_WAIT_FILE#      等待的行所在的文件号
ROW_WAIT_OBJ#       等待的行所属的object_id
ROW_WAIT_BLOCK#  等待的行所属的block
ROW_WAIT_ROW#     等待的行在blcok中的位置

手工释放锁
alter system kill session 'sid,se

    
[2][转] ORACLE 错误编号表一
    来源:    发布时间: 2013-10-29

ORA-00001: 违反唯一约束条件 (.) 
ORA-00017: 请求会话以设置跟踪事件 
ORA-00018: 超出最大会话数 
ORA-00019: 超出最大会话许可数 
ORA-00020: 超出最大进程数 () 
ORA-00021: 会话附属于其它某些进程;无法转换会话 
ORA-00022: 无效的会话 ID;访问被拒绝 
ORA-00023: 会话引用进程私用内存;无法分离会话 
ORA-00024: 单一进程模式下不允许从多个进程注册 
ORA-00025: 无法分配 
ORA-00026: 丢失或无效的会话 ID 
ORA-00027: 无法删去当前会话 
ORA-00028: 您的会话己被删去 
ORA-00029: 会话不是用户会话 
ORA-00030: 用户会话 ID 不存在。 
ORA-00031: 标记要删去的会话 
ORA-00032: 无效的会话移植口令 
ORA-00033: 当前的会话具有空的移植口令 
ORA-00034: 无法在当前 PL/SQL 会话中 
ORA-00035: LICENSE_MAX_USERS 不能小于当前用户数 
ORA-00036: 超过递归 SQL () 级的最大值 
ORA-00037: 无法转换到属于不同服务器组的会话 
ORA-00038: 无法创建会话: 服务器组属于其它用户 
ORA-00050: 获取入队时操作系统出错 
ORA-00051: 等待资源超时 
ORA-00052: 超出最大入队资源数 () 
ORA-00053: 超出最大入队数 
ORA-00054: 资源正忙,要求指定 NOWAIT 
ORA-00055: 超出 DML 锁的最大数 
ORA-00056: 对象 '.' 上的 DDL 锁以不兼容模式挂起 
ORA-00057: 超出临时表锁的最大数 
ORA-00058: DB_BLOCK_SIZE 必须为才可安装此数据库 (非 ) 
ORA-00059: 超出 DB_FILES 的最大值 
ORA-00060: 等待资源时检测到死锁 
ORA-00061: 另一个例程设置了不同的 DML_LOCKS 
ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0 
ORA-00063: 超出 LOG_FILES 的最大数 
ORA-00064: 对象过大以至无法分配在此 O/S (,) 
ORA-00065: FIXED_DATE 的初始化失败 
ORA-00066: LOG_FILES 为 但需要成为 才可兼容 
ORA-00067: 值 对参数 无效;至少必须为 
ORA-00068: 值 对参数 无效,必须在 和 之间 
ORA-00069: 无法获得锁定 -- 禁用了表锁定 
ORA-00070: 命令无效 
ORA-00071: 进程号必须介于 1 和 之间 
ORA-00072: 进程""不活动 
ORA-00073: 命令 介于 和 个参数之间时使用 
ORA-00074: 未指定进程 
ORA-00075: 在此例程未找到进程 "" 
ORA-00076: 未找到转储 
ORA-00077: 转储 无效 
ORA-00078: 无法按名称转储变量 
ORA-00079: 未找到变量 
ORA-00080: 层次 指定的全局区域无效 
ORA-00081: 地址范围 [,) 不可读 
ORA-00082: 的内存大小不在有效集合 [1], [2], [4] 之内 
ORA-00083: 警告: 可能损坏映射的 SGA 
ORA-00084: 全局区域必须为 PGA, SGA 或 UGA 
ORA-00085: 当前调用不存在 
ORA-00086: 用户调用不存在 
ORA-00087: 命令无法在远程例程上执行 
ORA-00088: 共享服务器无法执行命令 
ORA-00089: ORADEBUG 命令中无效的例程号 
ORA-00090: 未能将内存分配给群集数据库 ORADEBUG 命令 
ORA-00091: LARGE_POOL_SIZE 至少必须为 
ORA-00092: LARGE_POOL_SIZE 必须大于 LARGE_POOL_MIN_ALLOC 
ORA-00093: 必须介于 和 之间 
ORA-00094: 要求整数值 
ORA-00096: 值 对参数 无效,它必须来自 之间 
ORA-00097: 使用 Oracle SQL 特性不在 SQL92 级中 
ORA-00099: 等待资源时发生超时,可能是 PDML 死锁所致 
ORA-00100: 未找到数据 
ORA-00101: 系统参数 DISPATCHERS 的说明无效 
ORA-00102: 调度程序无法使用网络协议 
ORA-00103: 无效的网络协议;供调度程序备用 
ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源 
ORA-00105: 未配置网络协议 的调度机制 
ORA-00106: 无法在连接到调度程序时启动/关闭数据库 
ORA-00107: 无法连接到 ORACLE 监听器进程 
ORA-00108: 无法设置调度程序以同步进行连接 
ORA-00111: 由于服务器数目限制在 , 所以没有启动所有服务器 
ORA-00112: 仅能创建多达 (最多指定) 个调度程序 
ORA-00113: 协议名 过长 
ORA-00114: 缺少系统参数 SERVICE_NAMES 的值 
ORA-00115: 连接被拒绝;调度程序连接表已满 
ORA-00116: SERVICE_NAMES 名过长 
ORA-00117: 系统参数 SERVICE_NAMES 的值超出范围 
ORA-00118: 系统参数 DISPATCHERS 的值超出范围 
ORA-00119: 系统参数 的说明无效 
ORA-00120: 未启用或安装调度机制 
ORA-00121: 在缺少 DISPATCHERS 的情况下指定了 SHARED_SERVERS 
ORA-00122: 无法初始化网络配置 
ORA-00123: 空闲公用服务器终止 
ORA-00124: 在缺少 MAX_SHARED_SERVERS 的情况下指定了 DISPATCHERS 
ORA-00125: 连接被拒绝;无效的演示文稿 
ORA-00126: 连接被拒绝;无效的重复 
ORA-00127: 调度进程 不存在 
ORA-00128: 此命令需要调度进程名 
ORA-00129: 监听程序地址验证失败 '' 
ORA-00130: 监听程序地址 '' 无效 
ORA-00131: 网络协议不支持注册 '' 
ORA-00132: 语法错误或无法解析的网络名称 '' 
ORA-00150: 重复的事务处理 ID 
ORA-00151: 无效的事务处理 ID 
ORA-00152: 当前会话与请求的会话不匹配 
ORA-00153: XA 库中的内部错误 
ORA-00154: 事务处理监视器中的协议错误 
ORA-00155: 无法在全局事务处理之外执行工作 
ORA-00160: 全局事务处理长度 超出了最大值 () 
ORA-00161: 事务处理的分支长度 非法 (允许的最大长度为 ) 
ORA-00162: 外部 dbid 的长度 超出了最大值 () 
ORA-00163: 内部数据库名长度 超出了最大值 () 
ORA-00164: 在分布式事务处理中不允许独立的事务处理 
ORA-00165: 不允许对远程操作进行可移植分布式自治转换 
ORA-00200: 无法创建控制文件 
ORA-00201: 控制文件版本 与 ORACLE 版本 不兼容 
ORA-00202: 控制文件: '' 
ORA-00203: 使用错误的控制文件 
ORA-00204: 读控制文件时出错 (块 ,# 块 ) 
ORA-00205: 标识控制文件出错,有关详情,请检查警告日志 
ORA-00206: 写控制文件时出错 (块 ,# 块 ) 
ORA-00207: 控制文件不能用于同一数据库 
ORA-00208: 控制文件的名称数超出限制 
ORA-00209: 控制文件块大小不匹配,有关详情,请检查警告日志 
ORA-00210: 无法打开指定的控制文件 
ORA-00211: 控制文件与先前的控制文件不匹配 
ORA-00212: 块大小 低于要求的最小大小 ( 字节) 
ORA-00213: 不能重新使用控制文件;原文件大小为 ,还需 
ORA-00214: 控制文件 '' 版本 与文件 '' 版本 不一致 
ORA-00215: 必须至少存在一个控制文件 
ORA-00216: 无法重新调整从 8.0.2 移植的控制文件大小 
ORA-00217: 从 9.0.1 进行移植无法重新调整控制文件的大小 
ORA-00218: 控制文件的块大小 与 DB_BLOCK_SIZE () 不匹配 
ORA-00219: 要求的控制文件大小 超出了允许的最大值 
ORA-00220: 第一个例程未安装控制文件,有关详情,请检查警告日志 
ORA-00221: 写入控制文件出错 
ORA-00222: 操作将重新使用当前已安装控

    
[3][转] 执行commit时oracle做哪些工作
    来源:    发布时间: 2013-10-29

COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,在数据库中已经执行了数据更改,所以已经完成了99%的任务。

例如:下列操作已经产生: 

1.在SGA(Buffer Cache)中已经生成了undo块;

2.在SGA(Buffer Cache)中已经生成了产生改变的数据块和索引块;

3.在REDO LOG BUFFER生成了前面两项的redo信息;

4.依赖于前三项产生的数据量大小以及操作需要的时间,buffer中的数据可能已经有一部分输出到了磁盘;

5.所有需要的锁已经获得;     

当执行COMMIT命令时,只执行如下操作:     

1.为事务生成SCN:SCN是ORACLE数据库的一种计时信息,用以保证事务的顺序性,同时还用于失败恢复和保证数据库的读一致性和检查点,无论何时何人提交,SCN自动加1;

2.将事务相关的未写入redo log file中的redo信息从redo log buffer写入到redo log file,这才是真实的COMMIT,这步操作完成,说明我们已经完成COMMIT,事务从V$TRANSACTION中移除;

3.V$LOCK中记录的SESSION关于该事务的锁会释放,其他需要这些锁的事务被唤醒;

4.执行块清理,清理块头保存的事务信息。

本文链接


    
最新技术文章:
▪current online redo log缺失后的恢复
▪ORA-600 2662错误解决实例
▪ORA-00600 2662错误解决方法
▪Oracle Hidden Parameter:_allow_resetlogs_corruption
▪Oracle诊断事件列表
▪Oracle 隐含参数 _disable_logging 详解
▪ORA-00600 [2662]错误解决过程
▪Oracle里常见的执行计划
▪Oracle里另外一些典型的执行计划
▪Oracle服务器自动备份
▪Oracle固定SQL的执行计划(一)---SQL Profile
▪Oracle固定SQL的执行计划(二)---SPM
▪同一环境下新建Standby RAC库
▪Oracle快速克隆安装
▪Oracle单实例启动多个实例
▪Oracle的PLSQL别名中文出现乱码解决方法
▪ORA-00379: no free buffers available in buffer pool DEFAULT ...
▪RMAN-06023: no backup or copy of datafile 16 found to restor...
▪RMAN还原数据库报错问题解决案例
▪OEL6.8_X86平台部署Oracle 10gR2检测失败问题
▪Oracle 性能优化建议
▪Oracle SQL语句优化心得
CSS属性参考手册 iis7站长之家
▪Oracle dblink 查询 tns:无法解析指定的连接标识...
▪Red Hat Enterprise Linux 6使用udev配置Oracle ASM总结...
▪Linux6.6及以上版本配置Oracle ASM共享储存-UDEV
▪Oracle 12C 开启数据库归档模式
▪Solairs系统中配置Oracle 12c 开机启动
▪重建DBMS_STATS解决ORA-31626 ORA-21633以及ORA-04063 ORA...
▪Oracle ASMM 与AMM之间相互切换
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,