数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
ORACLE锁的管理

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

(转载自:http://fengyu.china.com/lock.htm)
ORACLE锁的管理

									2003-03 余枫
									
	ORACLE里锁有以下几种模式:
	
	0:none
	1:null      空								
	2:Row-S     行共享(RS):共享表锁  
	3:Row-X     行专用(RX):用于行的修改
	4:Share     共享锁(S):阻止其他DML操作
	5:S/Row-X   共享行专用(SRX):阻止其他事务操作
	6:exclusive 专用(X):独立访问使用
	
	数字越大锁级别越高, 影响的操作越多。

	一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。
	
	select ... from ... for update;      是2的锁。
	
		当对话使用for update子串打开一个游标时,
		所有返回集中的数据行都将处于行级(Row-X)独占式锁定,
		其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。
	
	insert / update / delete ... ;	     是3的锁。	
	
		没有commit之前插入同样的一条记录会没有反应, 
		因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
	
		创建索引的时候也会产生3,4级别的锁。
	
	locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 
	但DDL(alter,drop等)操作会提示ora-00054错误。
	
	有主外键约束时 update / delete ... ; 可能会产生4,5的锁。
	
	DDL语句时是6的锁。
	
	以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:

	select object_id,session_id,locked_mode from v$locked_object;

	select t2.username,t2.sid,t2.serial#,t2.logon_time 
	from v$locked_object t1,v$session t2 
	where t1.session_id=t2.sid order by t2.logon_time;

	如果有长期出现的一列,可能是没有释放的锁。
	
	我们可以用下面SQL语句杀掉长期没有释放非正常的锁:

	alter system kill session 'sid,serial#';

	如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
	
	当你采用的是直接连接数据库的方式,
	也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,
	因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
	
	记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。



相关文章

相关软件