oracle 锁查询 select加锁方法

来源:互联网 发布:手机铃声加大软件 编辑:程序博客网 时间:2024/05/30 05:22
--一、oracle对select加锁方法create table t_test(a number,b number);INSERT INTO t_test VALUES (1, 2);INSERT INTO t_test VALUES (3, 4);INSERT INTO t_test VALUES (5, 6);COMMIT;---session 1 模拟选中一个号码  SELECT * FROM t_test WHERE A = 1 FOR UPDATE SKIP LOCKED;         A          B---------- ----------         1          2---session 2 对a=1再进行select  SELECT * FROM t_test WHERE A = 1 FOR UPDATE SKIP LOCKED;--未选定行-- session 3 全表selectSELECT * FROM t_test FOR UPDATE SKIP LOCKED;         A          B---------- ----------         3          4         8          9--二、查询那些用户,操纵了那些表造成了锁机SELECT 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, ALL_OBJECTS O WHERE L.SID = S.SID   AND L.ID1 = O.OBJECT_ID(+)   AND S.USERNAME IS NOT NULL;--三、查出被锁的表,和锁住这个表的会话IDSELECT A.SESSION_ID, B.*  FROM V$LOCKED_OBJECT A, ALL_OBJECTS B WHERE A.OBJECT_ID = B.OBJECT_ID;--四、 查出对应的SQL语句SELECT VS.SQL_TEXT,       VSESS.SID,       VSESS.SERIAL#,       VSESS.MACHINE,       VSESS.OSUSER,       VSESS.TERMINAL,       VSESS.PROGRAM,       VS.CPU_TIME,       VS.DISK_READS  FROM V$SQL VS, V$SESSION VSESS WHERE VS.ADDRESS = VSESS.SQL_ADDRESS   AND VSESS.SID = (上面查出来的会话ID);--五、--1.查哪个过程被锁--查V$DB_OBJECT_CACHE视图:SELECT *  FROM V$DB_OBJECT_CACHE WHERE OWNER = '过程的所属用户'   AND LOCKS != '0';--2. 查是哪一个SID,通过SID可知道是哪个SESSION.--查V$ACCESS视图:SELECT *  FROM V$ACCESS WHERE OWNER = '过程的所属用户'   AND NAME = '刚才查到的过程名';--3. 查出SID和SERIAL#--查V$SESSION视图:SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '刚才查到的SID';--查V$PROCESS视图:SELECT SPID FROM V$PROCESS WHERE ADDR = '刚才查到的PADDR';--4. 杀进程--(1).先杀ORACLE进程:ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';--(2).再杀操作系统进程:KILL - 9 '刚才查出的SPID';--或--ORAKILL 刚才查出的SID 刚才查出的SPID--六、查找最耗费系统资源的SQL--CPUSELECT B.SQL_TEXT,       A.BUFFER_GETS,       A.EXECUTIONS,       A.BUFFER_GETS / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS),       C.USERNAME  FROM V$SQLAREA A, V$SQLTEXT_WITH_NEWLINES B, DBA_USERS C WHERE A.PARSING_USER_ID = C.USER_ID   AND A.ADDRESS = B.ADDRESS ORDER BY A.BUFFER_GETS DESC, B.PIECE;--IOSELECT B.SQL_TEXT,       A.DISK_READS,       A.EXECUTIONS,       A.DISK_READS / DECODE(A.EXECUTIONS, 0, 1, A.EXECUTIONS),       C.USERNAME  FROM V$SQLAREA A, V$SQLTEXT_WITH_NEWLINES B, DBA_USERS C WHERE A.PARSING_USER_ID = C.USER_ID   AND A.ADDRESS = B.ADDRESS ORDER BY A.DISK_READS DESC, B.PIECE;SELECT S.SID, S.VALUE "CPU Used"  FROM V$SESSTAT S, V$STATNAME N WHERE S.STATISTIC# = N.STATISTIC#   AND N.NAME = 'CPU used by this session'   AND S.VALUE > 0 ORDER BY 2 DESC;


原创粉丝点击