行级锁,系统在delete ,update 时,自动加的锁。另一种是,
操作者加的,防止他人同时操作,如,select * from tbl for update nowait,
当遇到 rollback,commit,解锁
操作者加的,防止他人同时操作,如,select * from tbl for update nowait,
当遇到 rollback,commit,解锁
解决方案 »
- oracle服务器连接串解密问题
- windows下连接oracle instance的问题
- 如果某表存在的话
- 两台服务器的ORACLE版本和初始化参数都配置的基本一样的, 但是同一条SQL的执行计划和效率相差很大(一个是HASH JOIN,一个是NESTED LOOP),不知为何?请看一下
- 求一个多表查询左连接或右连接的sql
- 求年龄
- 关于索引的疑惑
- 设计一个网上选课系统 关于选课人数控制的问题
- 存储过程的状态为什么变为Invalid
- PACKAGE
- oracle8.0.5jdbc连接问题
- 连接oracle 数据库时有没有碰到过这样的问题:the NetWork Adapter can not establish the connection!
借楼主一个地方,应该对楼主也有帮助的。
select for update后,如何检测该行记录已被锁呢?因为不检测的话,再次select for update就会死锁的吧。
[A]数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
可以通过alter system kill session ‘sid,serial#’来杀掉会话
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
问一下:
一个程序使用过select * from table1 where rkey=1 for update后,此时只有rkey为1的记录被加了行锁,你上面写的那些SQL如何查出该条记录是否已被锁住。上面的语句只能查出是哪个表被锁,能具体到哪一行吗?