微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Oracle的锁机制

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

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

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

-【锁类型】
DML锁(data locks,数据锁),关键字:select、Insert、delete、update...,用于保护数据的完整性;主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁
DDL锁(dictionary locks,字典锁),关键字:create table、alter table、drop...,用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internal locks and latches),保护 数据库的内部结构

-【悲观封锁和乐观封锁】
-悲观封锁:锁在用户修改之前就发挥作用
-乐观封锁:乐观认为数据在select出来到update进取并提交的这段时间数据不会被更改。Oracle仍然建议是用悲观封锁,因为这样会更安全

--测试锁表sql
--【SELECT ... FOR UPDATE命令】手动锁定,行级封锁,这种锁定方式是建立在数据库连接的基础上,一旦连接断开或者锁定进程commit时,这种锁定就自动解除。
select * from carseries2 where id<100 for update;                   --锁定select出来的所有行

--【for update of columns】 
--多表连接锁定时,指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。不指定则全锁
select t1.*,t2.* from carseries2 t1 left join carmodel t2 on t2.carseriesid=t1.id where t1.id<100 for update of t1.name;   
  
--[WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待]
select t.* from carseries2 t where t.id<100 for update Nowait;        --如果其他进程锁定了记录,避免被挂起(死锁),添加Nowait】
select t.* from carseries2 t where t.id<100 for update wait 5;        --如果记录锁定了,等待5秒。5秒后报异常
select t.* from carseries2 t where t.id<100 for update Nowait skip Locked; --立即执行sql时,即不等待,也不报资源忙异常。


//【查询被锁表信息】 --http://blog.csdn.net/u013991521/article/details/53535818
select t2.username oracle用户名,t2.sid 进程号,t2.serial# 序列号,t3.object_name 表名,t2.OSUSER 操作系统用户名,t2.MACHINE 机器名,t2.PROGRAM 操作工具,t2.logoN_TIME 登陆时间,t2.COMMAND,t2.LOCKWAIT 是否正在等待解锁,t2.SADDR,t2.PADDR,t2.TADDR,t2.sql_ADDRESS,t1.LOCKED_MODE 锁表模式
  from v$locked_object t1,v$session t2,dba_objects t3
 where t1.session_id = t2.sid
   and t1.object_id = t3.object_id
 order by t2.logon_time;
 
/********************************************************************【LOCKED_MODE 锁表模式】***************************************************/ 
--数字越大锁级别越高,影响的操作越多。
//0:none              
//1:null 空           --Select,有时会在v$locked_object出现。
 
//2:Row-S 行共享(RS):行级共享锁,sub share --Select for update,Lock For Update,Lock Row Share,select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。 

//3:Row-X 行独占(RX):行级排它锁,sub exclusive        --Insert,Update,Delete,Lock Row Exclusive,没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,我们必须释放掉上一个才能继续工作

//4:Share 共享锁(S):共享锁,阻止其他DML操作,share              --Create Index,Lock Share ,

//5:S/Row-X 共享行独占(SRX):共享行级排它锁,阻止其他事务操作,share/sub exclusive    --Lock Share Row Exclusive,具体来讲有主外键约束时update / delete … ; 可能会产生4,5的锁。 

//6:exclusive 独占(X):排它锁,独立访问使用,exclusive      --Alter table,Drop table,Drop Index,Truncate table,Lock Exclusive
 /************************************************************************************************************************************************/ 
 
--查出锁定表的session的sid,serial#,os_user_name,machine name,terminal和执行的语句
SELECT l.session_id sid,s.serial#,l.locked_mode,l.oracle_username,s.user#,l.os_user_name,s.machine,s.terminal,a.sql_text,a.action
FROM v$sqlarea a,v$session s,v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid,s.serial#;

--查找到数据库中所有的DML语句产生的锁,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
SELECT s.sid,s.username,s.schemaname,s.osuser,s.process,s.logon_time,l.type
FROM v$session s,v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;



--【kill锁】ps:不要自杀,需要新建sql窗口执行
//alter system kill session 'sid,seial#';

alter system kill session '1064,5785';



--查某session 正在执行的sql语句
SELECT  sql_text  FROM v$sqltext a
 WHERE (a.hash_value,a.address) IN 
 (SELECT DECODE(sql_hash_value,prev_hash_value,sql_hash_value),DECODE(sql_hash_value,prev_sql_addr,sql_address) FROM v$session b WHERE b.sid = '1085')  /* 此处1085 为SID*/
 ORDER BY piece ASC;
 


-【ORACLE定期清理INACTIVE会话】 --http://www.cnblogs.com/kerrycode/p/3636992.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Java Oracle 结果集是Java语言中处理数据库查询结果的一种方式。通常情况下,Java程序会通过JDBC连接Oracle数据库并执行一条查询语句,返回一个ResultSet结果集。ResultSet是一个行集,包含了查询语句的返回结果。在
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密。在计算机通信领域,AES加密算法是一种十分重要的保密技术,被广泛应用于银行、保险、互联网电子支付等重要场合。
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台性等优势,被广泛应用于企业级应用开发。而Oracle11g是一个强大的关系型数据库,由于其优秀的可靠性、安全性和扩展性,已经被广泛应用于企业级应用中。Jav
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的组成部分。为了满足移动端用户的需求,我们可以使用jQuery开发移动端大转盘抽奖活动。
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常被用来搭建高效的软件系统。Java是一种面向对象的编程语言,而Oracle是一种关系型数据库管理系统。Java 和Oracle在应用中的联系非常紧密,它们能够通过相互
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上,而 Oracle 是一个广泛使用的数据库软件。在 Java 对 Oracle 进行操作时,需要使用 Oracle 参数来确保程序正确工作。本文将从 Oracle 参数的定义、分类
随着电子竞技的兴起,越来越多的人开始慕名玩起了王者荣耀。而对于Python爱好者来说,这款游戏也有着很大的吸引力。因为Python可以帮助我们获取并处理游戏数据,从而获得更好的游戏体验。
Java与Oracle在数据处理方面都有着非常重要的地位,而在Java和Oracle的结合中,Integer类型则起到了不可替代的作用。Integer类型是Java中一个非常常用的数据类型,它可以表示范围在-2147483648到2147483647之间的整数
如今,JavaScript已经成为了web开发的必备技能之一,而IE浏览器也是众多开发者最常用的浏览器,那么,如何启用IE浏览器的JavaScript呢?
Java与Oracle是当今软件行业中广泛使用的两个技术。而SP(Stored Procedure)是Oracle数据库中存储过程的组件,可以在Java中调用Oracle数据库中的SP。在开发过程中,Java和Oracle的组合可以方便处理大规模的数据和建