精华内容
下载资源
问答
  • oracle查看未提交事务

    千次阅读 2018-11-21 10:18:00
    oracle查看未提交事务 SELECT s.sid, s.serial#, s.event, a.sql_text, a.sql_fulltext, s.username, s.status, s.machine, s.termin...

    oracle查看未提交事务

     SELECT s.sid,
           s.serial#,
           s.event,
           a.sql_text,
           a.sql_fulltext,
           s.username,
           s.status,
           s.machine,
           s.terminal,
           s.program,
           a.executions,
           s.sql_id,
           p.spid,
           a.direct_writes
      FROM (SELECT * FROM v$session WHERE status = 'ACTIVE') s
      LEFT JOIN v$sqlarea a
        ON s.sql_id = a.sql_id
     INNER JOIN v$process p
        ON s.paddr = p.addr

     

    posted @ 2018-11-21 10:18 酸奶加绿茶 阅读( ...) 评论( ...) 编辑 收藏
    展开全文
  • Oracle 查询未提交事务

    2021-03-03 10:25:06
    在使用 Oracle 数据库时,我们偶尔会遇到修改表结构(比如添加字段)无响应的情况,引起这种现象的一个可能原因是这个表上有未提交的DML事务。 那怎么查看是否有未提交事务呢?又怎样定位到具体语句呢? 现通过...

    在使用 Oracle 数据库时,我们偶尔会遇到修改表结构(比如添加字段)无响应的情况,引起这种现象的一个可能原因是这个表上有未提交的DML事务。

    那怎么查看是否有未提交的事务呢?又怎样定位到具体语句呢?

    现通过示例进行演示

    对已存在的表 table1 进行 delete 操作(暂不提交):

    delete from table1 where ID=2;
    

    查询当前 session 的 SID:

    select userenv('sid') from dual;
    

    结果如下:
    在这里插入图片描述

    现通过如下所示的 SQL 语句 1,可查询到未提交的 DML 语句:

    --SQL 语句 1:查询未提交事务 DML 语句
    SELECT  S.SID
           ,S.SERIAL#
           ,S.USERNAME
           ,S.OSUSER 
           ,S.PROGRAM 
           ,S.EVENT
           ,TO_CHAR(S.LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') 
           ,TO_CHAR(T.START_DATE,'YYYY-MM-DD HH24:MI:SS') 
           ,S.LAST_CALL_ET 
           ,S.BLOCKING_SESSION   
           ,S.STATUS
           ,( 
                  SELECT Q.SQL_TEXT 
                  FROM    V$SQL Q 
                  WHERE  Q.LAST_ACTIVE_TIME=T.START_DATE 
                  AND    ROWNUM<=1) AS SQL_TEXT   
    FROM   V$SESSION S, 
           V$TRANSACTION T  
    WHERE  S.SADDR = T.SES_ADDR;
    

    结果如下:
    在这里插入图片描述
    若想 kill 该 DML 语句,可执行:

    ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; //SID,SERIAL# 替换成上面查到的值
    

    即:

    alter system kill session '67,20514'; 
    

    注意:PRD 环境不要轻易 kill DML语句,需谨慎处理!

    我们再做进一步测试

    先回滚:
    在这里插入图片描述
    然后重新开始事务:

    delete from table1 where ID=3;
    insert into table2 values (5,'NEW');
    

    查询出当前 session 的 SID如下:
    在这里插入图片描述
    SQL 语句 1 查询出未提交 DML 语句如下:
    在这里插入图片描述
    说明:上述 SQL 语句 1 只查出未提交事务中第一条 DML 语句

    再次回滚,继续测试

    新建事务:

    insert into table2 values (5,'NEW');
    
    delete from table1 where ID=3;
    
    insert into table2 values (6,'OLD');
    

    查询出当前 session 的 SID如下:
    在这里插入图片描述
    SQL 语句 1 查询出未提交 DML 语句如下:
    在这里插入图片描述
    结论: SQL 语句 1 不是总能查询出未提交的 DML 语句

    补充
    如果只是想查询出未提交 DML 语句的 SID 和 SERIAL#,也可通过如下语句查询:

    select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
    

    若想 kill 该 DML 语句,执行:

    ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; //SID,SERIAL# 替换成上面查到的值
    
    展开全文
  • 主要给大家介绍了关于ORACLE中如何找到未提交事务的SQL语句,文中通过示例代码介绍的非常详细,对大家学习或者使用ORACLE具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • ORACLE 未提交事务与语句查询

    千次阅读 2015-11-02 17:36:32
    插入一条记录,不提交 sys@EDIPD> select sid from v$mystat where rownum  SID ----------  771 sys@EDIPD> insert into edi.master_trackingno_table(ID,CARRIER_ID,TRACKING_NO,STATUS) value


    插入一条记录,不提交


    sys@EDIPD> select sid from v$mystat where rownum<=1;

           SID
    ----------
           771


    sys@EDIPD> insert into edi.master_trackingno_table(ID,CARRIER_ID,TRACKING_NO,STATUS) values (edi.MASTER_TRACKINGNO_TABLE_SEQ.nextval,'1','11083229377990','1');

    1 row created.

    Elapsed: 00:00:00.01


    窗口二查询未提交事务与语句

    sys@EDIPD> select  s.sid, s.serial#, s.username,s.osuser, s.program, s.event, to_char(s.LOGON_TIME,'yyyymmdd-hh24:mi:ss') ,to_char(t.START_DATE,'yyyymmdd-hh24:mi:ss'),s.last_call_et as last_ct,s.BLOCKING_SESSION  block_sess, s.status, (select q.SQL_TEXT from  v$sql q where q.LAST_ACTIVE_TIME=t.START_DATE and rownum<=1) as SQL_TEXT  
    from v$session s, v$transaction t 

    where s.sADDR = t.SES_ADDR ;


       SID SERIAL# USERNAME   OSUSER     PROGRAM                         EVENT                        TO_CHAR(S.LOGON_T TO_CHAR(T.START_D    LAST_CT BLOCK_SESS STATUS
    ------ ------- ---------- ---------- ------------------------------- ---------------------------- ----------------- ----------------- ---------- ---------- ---------
    SQL_TEXT
    ----------------------------------------------------------------------------------------------------
       771   63711 SYS        oracle     sqlplus@cnedidp1 (TNS V1-V3)    SQL*Net message from client  20151102-17:07:22 20151102-17:35:51         19            INACTIVE
    insert into edi.master_trackingno_table(ID,CARRIER_ID,TRACKING_NO,STATUS) values (edi.MASTER_TRACKIN
    GNO_TABLE_SEQ.nextval,'1','11083229377990','1')

    展开全文
  • Oracle未提交事务引起的锁

    千次阅读 2018-09-17 23:46:19
    1. 中间件有线程执行了Delete语句之后,一直处于等待状态,没有COMMIT提交事务,对表施加了行锁且该线程无法复用(中间件总线程数有限制) 2. 对表施加了行锁之后,后续中间件线程如果需要修改该行,将被阻塞。 ...

    笔者所在公司最近上了一套系统,系统使用中间件连接Oracle数据库,使用一段时间之后系统就会停止响应。发现问题在于2点:

    1. 中间件有线程执行了Delete语句之后,一直处于等待状态,没有COMMIT提交事务,对表施加了行锁且该线程无法复用(中间件总线程数有限制)

    2. 对表施加了行锁之后,后续中间件线程如果需要修改该行,将被阻塞。

    以上两个因素不断发生,最终导致中间件线程数耗尽,系统停止响应。

    下面会分两个部分,第一个部分是直接给出判断以上故障的SQL语句,第二部分是通过做实验的方法重现问题

     1.直接判断未提交事务引起的表的行锁

    1.1  判断哪个SESSION执行了DML(Insert/Update/Delete) 但是未提交 (Commit ),引起的行锁

    --找到修改了数据,但是未提交的Session,选择WAIT_CALSS='Idle',也就是Session处于休息状态,但是有锁定的表
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE A.WAIT_CLASS='Idle'
    AND A.SECONDS_IN_WAIT>10/*SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒*/
    
           SID    SERIAL# USERNAME                       EVENT                                                            WAIT_CLASS                                                       SECONDS_IN_WAIT PREV_EXEC_START LOCKED_MODE OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE
    ---------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------------- --------------- ----------- ------------------------------ -------------------------------------------------------------------------------- -------------------
           194        240 TEST                           SQL*Net message from client                                      Idle                                                                       18046 2018/9/17 18:30           3 TEST                           TESTLOCK                                                                         TABLE
    

    如果确认这些SESSION确实有问题,可以直接KILL掉,传入前面语句的SID和SERIAL#

    ALTER SYSTEM KILL SESSION 'SID,SERIAL#'

    注:ORACLE有个很有趣的地方,就是KILL SESSION的时候需要填“”SERIAL#“,是为了避免刚刚查询的时候获得了一个SID,然后你打算杀掉他,在这个时间之间,打算杀掉的SESSION结束了断开连接,然后新的SESSION复用了这个SID,也就是避免误杀,SQL SERVER 直接KILL可以了。

    1.2  判断哪些SESSION被阻塞了,且定位到是谁阻塞了,是由于哪个表哪个行引起的阻塞

    --当SESSION被阻塞,通过ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#这几个字段找到ROWID,然后通过ROWID找到被锁定的记录
    SELECT BLOCKING_SESSION,SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
            ,dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE BLOCKING_SESSION IS NOT NULL ;
    
           SID    SERIAL#     AUDSID PADDR                 USER# USERNAME                       EVENT                                                            WAIT_CLASS                                                       SECONDS_IN_WAIT ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE         DBMS_ROWID.ROWID_CREATE(1,ROW_
    ---------- ---------- ---------- ---------------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------------- ------------- -------------- --------------- ------------- ----------------------- ----------------- ---------------- ------------------------------ -------------------------------------------------------------------------------- ------------------- ------------------------------
            12       4449 4294967295 00007FFFF04DDFA0          0 SYS                            enq: TX - row lock contention                                    Application                                                                18245         75465              4             175             1 VALID                                   1              194 TEST                           TESTLOCK                                                                         TABLE               AAASbJAAEAAAACvAAB
    

     

    通过上面返回的OBJECT_NAME 和ROWID,知道是由于那个行引起的阻塞

    SELECT * FROM 前面返回的表名称
    where ROWID=前面返回的ROWID
    
    SQL> select * from test.TESTLOCK where rowid='AAASbJAAEAAAACvAAB';
            ID NAME
    ---------- --------------------------------------------------------------------------------
             2 kkkkkkkkkkkkkk

    1.3哪些session阻碍了,哪些被阻碍了以及执行的Sql语句

    SQL> SELECT s.BLOCKING_SESSION, l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
      2         l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
      3       FROM v$sqlarea a,v$session s, v$locked_object l
      4      WHERE l.session_id = s.sid
      5        AND s.prev_sql_addr = a.address
      6  ORDER BY sid, s.serial#;
    BLOCKING_SESSION        SID    SERIAL# LOCKED_MODE ORACLE_USERNAME                     USER# OS_USER_NAME                   MACHINE                                                          TERMINAL         SQL_TEXT                                                                         ACTION
    ---------------- ---------- ---------- ----------- ------------------------------ ---------- ------------------------------ ---------------------------------------------------------------- ---------------- -------------------------------------------------------------------------------- ----------------------------------------------------------------
                 194         12       4449           3 SYS                                     0 DIGITAL-CAIYH\CaiYH            WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH    update test.testlock set name='kkkkkkkkkkkkkk' where id=2                        
                            194        240           3 TEST                                   86 DIGITAL-CAIYH\CaiYH            WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH    update testlock set name='eeeeeeeeee' where id=2                                 
    
    SQL> 

    1.4 查询那张表被锁定 被谁锁定

     --查询那张表被锁定 被谁锁定
     select s.sid,
               s.serial#,
               lo.oracle_username,
               lo.os_user_name,
               ao.object_name  as 被锁表名称table_locked_name,
               s.username,
               s.schemaname,
               s.osuser,
               s.process,
               s.machine,
               s.terminal,
               lo.locked_mode
          from v$locked_object lo, all_objects ao, v$session s
         where ao.object_id = lo.object_id
           and lo.session_id = s.sid
         order by s.sid asc;
    
           SID    SERIAL# ORACLE_USERNAME                OS_USER_NAME                   被锁表名称TABLE_LOCKED_NAME    USERNAME                       SCHEMANAME                     OSUSER                         PROCESS                  MACHINE                                                          TERMINAL         LOCKED_MODE
    ---------- ---------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------ ---------------------------------------------------------------- ---------------- -----------
            12       4449 SYS                            DIGITAL-CAIYH\CaiYH            TESTLOCK                       SYS                            SYS                            DIGITAL-CAIYH\CaiYH            9480:21728               WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH              3
           194        240 TEST                           DIGITAL-CAIYH\CaiYH            TESTLOCK                       TEST                           TEST                           DIGITAL-CAIYH\CaiYH            15212:12596              WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH              3
    

    2.通过实验过程重现整个过程

    首先说明,Oracle数据库是写阻塞写,读写之间是互相不阻塞的,也就是以下两个语句在不同的窗口(SESSION)执行的话,由于它们都是更新同一行,如果第一个执行的没有COMMIT,后执行那个会一直处于被阻塞状态:

     

    --第一个窗口执行如下语句
    UPDATE TESTLOCK
    SET AAA=11
    WHERE AAA=1
    
    --第二个窗口执行以下语句
    UPDATE TESTLOCK
    SET AAA=12
    WHERE AAA=1

    下面开始我们的实验,Oracle的版本是11G 带着如下问题:

    1. 如何知道一个连接修改了数据,但是未提交,导致对表产生了锁定?
    2. 对于1的疑问,可否知道具体锁定了哪个表的哪个记录?

    首先我们在PS/SQL客户端建立三个窗口,分别为:测试窗口1、测试窗口2、观察窗口,实验以“TEST”账号登录,为了避免其他SESSION干扰我们的实验,很多语句添加了“WHERE USERNAME='TEST'“作为限定

    ,如果想重复实验过程,需要修改这部分语句。

    1.在测试窗口1建立测试用的表,并插入10条记录

     

    /*初始化测试表*/
    
    --建立一个测试表
    create table TESTLOCK
    (
      aaa number not null,
      bbb nvarchar2(10) not null,
      ccc nvarchar2(10) not null
    );
    create INDEX PK_TESTLOCK on TESTLOCK (aaa);
    
     
    --随便插入点数据
    INSERT INTO TESTLOCK VALUES ('1','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('2','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('3','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('4','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('5','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('6','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('7','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('8','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('9','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('10','BBB','CCC');
    
     
    --然后我们的表里面就有了一些数据
    SELECT * FROM TESTLOCK;
    COMMIT;

    2.在测试窗口2,查询测试表 ,可以看到步骤1添加的10条记录

    SELECT * FROM TESTLOCK;

     

    3.在观察窗口观察当前Session的情况和表锁的情况 

    这里我们用到了Oracle的三个系统试图

    V$SESSION:
    
    V$LOCK:
    
    V$LOCKED_OBJEC:

     

    --当前的Session情况
    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,      BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION
    FROM V$SESSION
    WHERE USERNAME='TEST';
    
    --当前TESTLOCK表锁的情况
    SELECT * FROM V$LOCK
    WHERE TYPE='TM'
    AND ID1=(SELECT OBJECT_ID FROM DBA_OBJECTS
                     WHERE OBJECT_NAME='TESTLOCK');
    
    SELECT XIDUSN,XIDSLOT,XIDSQN,OBJECT_ID,SESSION_ID,ORACLE_USERNAME,PROCESS,LOCKED_MOD
    FROM V$LOCKED_OBJEC
    WHERE OBJECT_ID=(SELECT OBJECT_ID FROM DBA_OBJECTS
                     WHERE OBJECT_NAME='TESTLOCK');

    从下图可以看出TEST账号一共产生了4个SESSION,分别是PLSQL本身连接到数据库和我们建立的三个窗口 

    我们关注几个字段:

    EVENT:oracle的session正在等待的数据或者事件

    WAIT_CLASS:等待事件的名称

    blocking_session_status:如果blocking_session_status字段是VALID,表示该SESSION被阻塞了

    blocking_session:被哪个Session阻塞

    通过以上4项观察,没有任何Session被阻塞,当前三个Session处于等待客户端消息状态(EVENT=SQL*Net message from client, WAIT_CLASS=Idle),剩下一个Session正在向客户端发送消息(EVENT=SQL*Net message to client,WAIT_CLASS=Network),就是我们当前的观察窗口

    后面两个查询V$LOCK和V$LOCKED_OBJECT的语句没有任何返回,表示当前TESTLOCK表没有被锁定

     

    4. 在测试窗口1更新表TESTLOCK,但是不要提交(Commit)

    UPDATE TESTLOCK
    SET AAA=11
    WHERE AAA=1

    PL/SQL左上角会展示提交和回滚的图标,表示事务没有提交

     

    5.再次在观察窗口执行步骤3的语句:

    通过对V$LOCK和V$LOCKED_OBJECT的查询可以知道,SID=1947 锁定了TESTLOCK表,其中LMODE=3(行级排他锁,我们这里是通过UPDATE产生的)

     

    锁模式

    锁描述

    解释

    SQL操作

    0

    none

     

     

    1

    NULL

    Select

    2

    SS(Row-S)

    行级共享锁,其他对象只能查询这些数据行

    Select for update

    Lock for update

    Lock row share

    3

    SX(Row-X)

    行级排它锁,在提交前不允许做DML操作

    Insert/update/Delete

    Lock row share

    4

    S(Share)

    共享锁

    Create index

    Lock share

    5

    SSX(S/Row-X)

    共享行级排它锁

    Lock share row exclusive

    6

    X(Exclusive)

    排它锁

    Alter table

    Drop able

    Drop index

    Truncate table

    Lock exclusive

     

    6.回到之前的第一个问题,如何知道一个SESSION修改了数据但是没COMMIT,在观察窗口执行如下语句:

     

    --找到修改了数据,但是未提交的Session,选择WAIT_CALSS='Idle',也就是Session处于休息状态,但是有锁定的表
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE A.WAIT_CLASS='Idle'
    AND A.SECONDS_IN_WAIT>10/*SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒*/
    AND USERNAME='TEST';

    只需要判断WAIT_CLASS='Idle',同时在V$LOCKED_OBJECT存在锁定的对象且SESSION空闲了一段时间,如图,就可以判断SID=1947 锁定了TESTLOCK表,SECONDS_IN_WAIT就可以认为是锁定的时长,单位是秒 

     

    7.在观察窗口执行以下语句,从事务的角度观察

     

    --从事务角度观察,连接v$session和v$transaction
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.START_DATE
    FROM v$session a
    INNER JOIN v$transaction b
    ON a.taddr=b.addr
    WHERE USERNAME='TEST'

    连接两个视图后,可以知道SID=1947启动了事务

     

    8.接下来我们来验证在测试窗口2更新和删除记录,但是更新和删除的记录和测试窗口1的不是同一条记录,测试窗口1更新的记录为AAA=1,在更新和删除后马上提交(COMMIT)

     

    --更新和测试窗口1不同的记录
    UPDATE TESTLOCK
    SET AAA=100
    WHERE AAA=2;
    COMMIT ;
    
    --删除和测试窗口1不同的记录
    DELETE FROM TESTLOCK
    WHERE AAA=3;
    COMMIT;
    
    SELECT * FROM TESTLOCK;

    可以看到更新和删除都没有被阻塞,查询表结果如图,可以看到AAA=2的数据被更新了,AAA=3的数据被删除,AAA=1的数据还是和原来一样,即看不到测试窗口1的数据更新,也就是凡是没有提交的数据都是看不到的。

     

    9.下面来验证:在前面一个UPDATE没有提交的情况下,另外一个连接修改TESTLOCK的同一条记录,会发生什么?

    在测试窗口2执行以下语句:但是不要提交(COMMIT)

    --更新和测窗口1相同的记录
    UPDATE TESTLOCK
    SET AAA=12
    WHERE AAA=1

    该语句会一直处于“正在执行”状态,实际上就是TESTLOCK上面有行锁,该SESSION一直在等待之前的行锁释放 

     

    10.再次在观察窗口执行步骤3的语句:

    观察SID=9,显示EVENT='enq: TX - row lock contention' ,表示正在等待一个行锁释放,BLOCKING_SESSION 说明该SESSION被SID=1947 阻塞了,也就是测试窗口1的SESSION

    观察V$LOCK其实区分不了哪个LOCK是没提交,哪个是,两个LOCK的显示都是一样的,这点倒很奇怪

     

    观察V$LOCKED_OBJECT,可以通过XINUSN/XIDSLOT/XIDSQN 判断,这三个字段是和回滚相关的字段,如果都为0,可以判断为被阻塞

     

    11. 寻找被锁定的具体行

    在观察窗口执行如下语句:

     

    --当SESSION被阻塞,通过ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#这几个字段找到ROWID,然后通过ROWID找到被锁定的记录
    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
            ,dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE USERNAME='TEST'
    AND BLOCKING_SESSION IS NOT NULL ;

     获得具体被阻塞表的ROWID,语句是dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)

    查询获得具体的被阻塞记录,正好是我们在测试窗口1  Update的记录

    --通过前面的函数rowid_create获得具体的ROWID,然后在锁定表中查询记录
    SELECT * FROM TESTLOCK
    where ROWID='AAJ2QDAAnAAGrwnAAA'

     

     

    12.杀死阻塞了其他连接的SESSION

    从前面可见是SESSION 1947 阻塞了当前线程,查询获得SID=1947,查询其SERIAL#,然后执行SQL杀死该SESSION

    ALTER SYSTEM KILL SESSION '1947,63353'

     13. 再次观察当前SESSION情况,SID=9,不再是阻塞状态

     

    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION
    FROM V$SESSION
    WHERE USERNAME='TEST';

     

     

    展开全文
  • 删除oracle未提交事务

    千次阅读 2012-09-20 09:33:07
    先查询出未提交事务 SELECT dob.OBJECT_NAME Table_Name,lo.SESSION_ID||', '||vss.SERIAL# 删除号, lo.locked_mode,lo.SESSION_ID, vss.SERIAL#,vss.action Action,vss.osuser OSUSER, vss.LOGON_TIME, ...
  • 查看oracle是否有未提交事务

    千次阅读 2012-03-29 17:58:43
      select * from v$transaction;   select SQL_TEXT from v$sql,v$transaction where LAST_ACTIVE_TIME=START_DATE;
  • 查看Oracle中是否有未提交事务

    千次阅读 2020-06-17 15:47:25
    select SQL_TEXT from v$sql,v$transaction where LAST_ACTIVE_TIME=START_DATE;
  • oracle数据库自动提交事务(autocommit)

    万次阅读 2015-08-13 10:36:14
    oracle数据库自动提交事务(autocommit)为OFF,但事务自动提交了   问题描述:如上图所示,以scott账号登陆,执行delete from dept where deptno=50后,再换system账号登陆,发现deptno=50的数据行已经被删除了...
  • oracle数据库自动提交事务(autocommit)为OFF,但事务自动提交了from:http://blog.sina.com.cn/s/blog_68fe7e150100z7tn.html...
  • oracle撤回已经提交事务的操作

    千次阅读 2019-02-13 15:08:20
    1&gt;ALTER table 表名 enable row MOVEMENT(启用行移动功能) 2&gt;FLASHBACK TABLE 表名 to timestamp to_date('2019-2-13 14:50:55','YYYY-MM-DD HH24:MI:SS')
  • Oracle做insert或者update时未提交事务导致表锁定解决办法 //查看被锁定表有几个 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o....
  • 这节课把事务槽和oracle事务提交方式讲一下 讲完以后再去回顾上节课讲的oracle的undo里面的事务的整个操作过程的时候大家就更清晰了 一)事务槽数量参数 每一个oracle数据块里面在数据块的头部都有事务槽 ...
  • oracle自动提交事务以及手动

    千次阅读 2019-08-16 16:13:46
    1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT; 2、隐式提交: 用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT...
  • oracle事务处理 自动提交.pdf
  • 使用 Oracle GoldenGate 将 SQL Server 表数据同步到 Oracle 中。 偶尔检查MSSQL日志使用情况,发现日志越来越大,17GB了。
  • 在 .NET 中使用 oracle 数据库 事务提交事务保存点 注意:ODP.NET 驱动程序针对 oracle 数据库访问进行了优化,因此可以获得最佳性能,并且它们还支持 oracle 数据库的丰富特性,如 BFILE、BLOB、CLOB、XMLType 等...
  • 今天在修改bug的过程中,一条更新数据的sql执行怎么也执行不了,进入貌似“排队”的情况,一直处于等待的状态,第一直觉是事务锁起到坏作用,后在项目组高手的协助下找到了原因,是数据被锁住了。
  • 最近有两个项目同时访问数据库查询同一条数据导致产生编号重复状况,经过搜索最后用手动提交事务和数据库锁解决的,以下为解决方法,本人也是第一次操作,如果各位有更好的解决方法请留言告知,感谢! 项目框架均为...
  • oracle事务提交机制

    千次阅读 2018-05-28 17:36:52
    提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL&gt;COMMIT;2、隐式提交: 用SQL命令间接完成的提交为隐式...
  • Oracle提交事务(COMMIT语句)

    千次阅读 2018-03-22 08:09:00
    Oracle中,COMMIT语句提交当前事务的所有更改。发出提交后,其他用户将能够看到您的更改。 语句 Oracle / PLSQL中COMMIT语句的语法是: COMMIT [ WORK ] [ COMMENT clause ] [ WRITE clause ] [ FORCE clause ]...
  • 在使用oracle数据库时,有时需要提交事务,有时不需要 DML语言,比如update,delete,insert等修改表中数据的需要commit; DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit);
  • jdbc,oracle使用事务提交处理

    千次阅读 2012-08-16 20:05:53
    如果在SQL中需要同时执行多个SQL语句,而且其中任意一个SQL执行失败其他执行过的都撤销,就需要用到事务,jdbc,Oracle中使用事务是如下方式。Connection conn=DriverManager.getConnection(url); try { //设置...
  • 今天在公司服务器上执行了一句update SQL 并且提交事务,忘记加筛选条件,导致整表字段被改,一下就来记录下回滚过程。 1、找到自己执行update语句的时间 select r.FIRST_LOAD_TIME,r.* from v$sqlarea r order by...
  • oracle时,很多人会认为,DBWn的写与...现在,证明:一个未提交事务,也是有可能被写入数据文件的。  会话1: sys@ORCL> select xidusn,xidslot,xidsqn,ubafil,ubablk from v$transaction; no rows select
  • oracle 提交事务 详细步骤入

    千次阅读 2012-11-06 17:57:30
    oracle提交事务详细步骤入如下: 1、用户通过sqlplus启动用户进程,使用oracle net services通过3层或n层基于web的客户机请求发送给服务器。 2、服务器接收到客户连接请求后,首先判断该用户连接的合法性,如果...
  • oracle事务处理 自动提交

    千次阅读 2013-08-12 14:54:55
    提交数据有三种类型: 显式提交、隐式提交及自动提交。下面分别说明这三种类型。 1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT; 2、隐式提交: 用SQL命令间接完成的提交为隐式提交...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,731
精华内容 43,092
关键字:

oracle查看未提交事务