1。exclusive mode:如果不希望别的会话 lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。这个锁定模式级别最高,并发度最小。
2。share mode:如果允许别的会话查询或select for update以及lock table table_name in share mode,不允许insert/update/delete,可以用lock table table_name in share mode。
首先,向你介绍一个动态视图:v$sql
该视图展示最近一段时间所有执行过的sql语句:
select from v$sql
即可。
如果报错找不到v$sql,一般是权限问题,换sysdba就肯定能查到。
但要注意的是“隐式sql”,很多sql语句是调用执行的,(比如,存储过程中对dbms包的调用,再如执行create 语句所触发的对系统表空间、数据字典的修改等等。),这些语句同样会展现在v$sql中。
还有其它与sql历史记录相关的v$视图,详情可以参考Oracle官方文档《Oracle® Reference》,直接给你个102的文档链接,够方便了吧:
>
在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的会话就更难了,下面这叫查询语句可以查询出所以被锁的会话。如下:
SELECT snusername, mSID,snSERIAL#, mTYPE,
DECODE (mlmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl',
4, 'Share',
5, 'S/Row Excl',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (mrequest,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl',
4, 'Share',
5, 'S/Row Excl',
6, 'Exclusive',
request, LTRIM (TO_CHAR (mrequest, '990'))
) request,
mid1, mid2
FROM v$session sn, v$lock m
WHERE (snSID = mSID AND mrequest != 0) --存在锁请求,即被阻塞
OR ( snSID = mSID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND mrequest = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT sid1, sid2
FROM v$lock s
WHERE request != 0 AND sid1 = mid1
AND sid2 = mid2)
)
ORDER BY id1, id2, mrequest;
通过以上查询知道了sid和 SERIAL#就可以开杀了
alter system kill session 'sid,SERIAL#';
希望对你有所帮助。我也是不太懂,是在网上了解的。努力学习ing~~~
用如下语句查询:
select 'blocker(' || lbsid || ':' || sbusername || ')-sql:' ||qbsql_text blockers,
'waiter (' || lwsid || ':' || swusername || ')-sql:' ||
qwsql_text waiters
from v$lock lb, v$lock lw, v$session sb, v$session sw, v$sql qb, v$sql qw
where lbsid = sbsid
and lwsid = swsid
and sbprev_sql_addr = qbaddress
and swsql_address = qwaddress
and lbid1 = lwid1
and swlockwait is not null
and sblockwait is null
and lbblock = 1;
如果有被锁的sql,查询中有结果:
下面3个语句是我经常使用来解决oracle锁问题的 -- 注意你的用户有没有权限问题
1 查看被锁的表
SELECT pspid, aserial#, cobject_name, bsession_id, boracle_username,
bos_user_name
FROM v$process p, v$session a, v$locked_object b, all_objects c
WHERE paddr = apaddr AND aprocess = bprocess
AND cobject_id = bobject_id
2 查看是哪个进程锁的
SELECT sid, serial#, username, osuser FROM v$session where osuser = 'tangpj'
3 杀掉这个进程 alter system kill session 'sid,serial#';
select bowner,bobject_name,asession_id,alocked_mode
from v$locked_object a,dba_objects b
where bobject_id = aobject_id;
看看这个行不行~
你说的不是死锁,死锁的话oracle会自己处理,杀掉会话。你说的应该只是普通的锁,造成了阻塞,执行一个脚本$ORACLE_HOME/rdbms/admin/utllocktsql,可以把锁结构列出来。
以上就是关于oracle数据库中 alter table 表名 lock mode(row) 这句话 什么意思全部的内容,包括:oracle数据库中 alter table 表名 lock mode(row) 这句话 什么意思、如何查询oracle数据库的 *** 作记录、oracle数据库实例被锁如何解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)