我使用MFC的CRecordSet->pDatabase来开始事务,事务中更新一条记录
try{
    m_pSet->Close();
    m_pSet->m_pDatabase->BeginTrans();
    m_pSet->Open();
    MessageBox("事务开始");----1
    m_pSet->m_strFilter="学号=='001'";//库中有001,一定能找到。
    m_pSet->Requery();
    m_pSet->Edit();
    m_pSet->Name="小李";
    m_pSet->Update();
    MessageBox("编辑完成");----2
    m_pSet->m_strFilter="学号=='002'";//库中有002,一定能找到。
    m_pSet->Requery();
    m_pSet->Edit();
    m_pSet->Name="小张";
    m_pSet->Update();
    m_pSet->m_pDatabase->CommitTrans();
}
catch(CDBException *e1)
{
    e1->Delete();
    m_pSet->m_pDatabase->Rollback();
    MessageBox("编辑失败!");
    return;
}
在事务中我故意加了两个消息框,为的是并行调试;
我同时执行两个程序(访问同一个库)当A执行到1时,让B开始执行也执行到1;然后让A继续执行到2停下,让B也执行到2;再让A继续执行时它停止了,因为B的事务正在进行中,停了一段时间后A程序异常了,而这个异常我没有截获到,也就是说一个事务过长,而另一个程序因等待时间太长而异常,SQL有没有设置等待多长时间的设置。让它多等一会,或者能让我自己捕获到这个异常,好让我告诉用户“因有其他用户正在使用请稍后在试”

解决方案 »

  1.   

    CDatabase 有一个SetQueryTimeout
      

  2.   

    问题自己解决了,我程序中的源码是
    catch(CDBException *e1) 

        e1->Delete(); 
        m_pSet->m_pDatabase->Rollback(); 
        MessageBox("编辑失败!"+e1.strErr); 
        return; 

    在执行MessageBox时该句时,e1已被删除,所以出现异常。我贴出来的代码是正确的。
    异常我是捕获了,但是,异常后,m_pSet因为没有查询成功,它被自动关闭了。为什么呢?打开该表是在OnInit..中完成的,A异常后,我在执行编辑按钮就又出现异常,我一调试是因为它不自动关闭了。