场景:所建所有账户无法登入应用,发现出现表锁
需要查询是否表锁了:
1、登入数据所在的数据库:用管理员账户登入
2、查询是否存在锁表的sql
SELECT *
FROM V$SESSION T1, V$LOCKED_OBJECT T2
WHERE T1.SID = T2.SESSION_ID;
3、进行表锁sql:
共享方式的表级锁( Share)
LOCK TABLE <表名>[,<表名>]... IN SHARE MODE [NOWAIT]
LOCK TABLE TEST_USER IN SHARE MODE
独占方式表级锁( Exclusive)
LOCK TABLE <表名>[,<表名>].... IN EXCLUSIVE MODE [NOWAIT]
LOCK TABLE TEST_USER IN EXCLUSIVE MODE
4、查看被锁表的信息:
SELECT SESS.SID,
SESS.SERIAL#,
LO.ORACLE_USERNAME,
LO.OS_USER_NAME,
AO.OBJECT_NAME,
LO.LOCKED_MODE
FROM V$LOCKED_OBJECT LO, DBA_OBJECTS AO, V$SESSION SESS
WHERE AO.OBJECT_ID = LO.OBJECT_ID
AND LO.SESSION_ID = SESS.SID;
查询被锁死的表:
select p.spid,
a.serial#,
c.object_name,
b.session_id,
b.oracle_username,
b.os_user_name
from v$process p, v$session a, v$locked_object b, all_objects c
where p.addr = a.paddr
and a.process = b.process
and c.object_id = b.object_id;
5、查看当前数据库正在使用的连接数
select count(*) from v$process
6、 查看用户当前占用的连接数
select a.OSUSER 用户,count(1) 连接数 from v$session a group by OSUSER order by 连接数 desc
7、 查看Oracle当前配置的最大连接数
select value from v$parameter where name ='processes'
8、把锁给干掉:
alter system kill session 'sid列,serial#列'
行锁
将事务提交,由自动提交改为手动提交。当对某条数据进行操作时,在没有提交事务之前,其他任何操作对该条数据,都是读的以前的数据,防止脏读
间隙锁
在对表进行区间查询或修改,由该操作独享,其他操作均需要该操作执行完成。比较影响性能