Oracle表锁与行锁

场景:所建所有账户无法登入应用,发现出现表锁

需要查询是否表锁了:

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#列'

行锁

将事务提交,由自动提交改为手动提交。当对某条数据进行操作时,在没有提交事务之前,其他任何操作对该条数据,都是读的以前的数据,防止脏读

间隙锁

在对表进行区间查询或修改,由该操作独享,其他操作均需要该操作执行完成。比较影响性能

猜你喜欢

转载自blog.csdn.net/YHM_MM/article/details/108903673