try
{
_ConnectionPtr pConn1 = NULL;
pConn1.CreateInstance( "ADODB.Connection "); 
_bstr_t strSQL1 = "...";
pConn1->Mode = adModeShareDenyNone;//不拒绝其他用户的读写访问(Jet OLE DB Provider的默认值)
pConn1->IsolationLevel = adXactCursorStability;//只允许读其他事务已提交的改变
pConn1->Open( strSQL1, "", "", adConnectUnspecified );
//
pConn1->BeginTrans();//开始事务...
//
pConn1->Excute(...);//相关更改操作////开始另外一个连接
   _ConnectionPtr pConn2 = NULL;
   _RecordsetPtr  pRecs2 = NULL;
   pConn2.CreateInstance( "ADODB.Connection "); 
   pRecs2.CreateInstance( __uuidof(Recordset));
   _bstr_t strSQL2 = "...";
   pConn2->Mode = adModeReadWrite;//连接是可读写的
   pConn2->IsolationLevel = adXactCursorStability;//只允许读其他事务已提交的改变
   pConn2->Open( strSQL2, "", "", adConnectUnspecified );
   //
   //pConn2->Excute(...);//相关更改操作,比如修改、添加删除等
   pRecord2->Open(_bstr_t("select * from tbxx", _variant_t((IDispatch*)pConn2,true), adOpenDynamic, adLockOptimistic,adCmdText );
   //***!!!此处会出错(但是当pConn1处没有更改操作时,此处没有问题,为什么?)
   //
   pRecord2->Close();
   pRecord2 = NULL;
   pConn2->Close();
   pConn2 = NULL;
////pConn1->RollBack();
pConn1->Close();
pConn1 = NULL;
//
}
  如以上示例代码,在一个连接开始BeginTrans事务后,对别的连接有什么影响,别的连接可以正常读取、更改数据库吗?
  对了,以上测试代码在VC6+SQLServer2000环境下;

解决方案 »

  1.   

    我想问的就是在一个连接BeginTrans()后,还没有RollBack()或CommitTrans()以前,期间对别的连接有什么影响?
      

  2.   

    begintrans在committrans之间只是保证了这之间的代码是原子操作,不能分开..而现在的数据库一般都支持多事务并发..所以多连接操作数据库是没有问题的,如果像你担心的那样,一个事务迟迟不能结束,别人也迟迟不能访问该数据库,那这个数据库岂不被废了??当然,如果你在对数据库操作的过程中对数据上了锁的话,其它事务是访问不了这些数据的..直到事务结束...
      

  3.   

    这是数据库知识,跟VC++ 、ADO没有关系,跟DBMS有关系。
      

  4.   

    你不是使用了adXactCursorStability么?? 这个东西指明你不能查看在其他事务过程中还没有确认的变化。也就是说你第一个事务中做了修改,在没有结束事务之前,别的事务是不是访问的..
      

  5.   

    将adXactCursorStability改用adXactBrowse试试看..
      

  6.   

    adXactUnspecified //指示提供者使用的隔离级别与指定的不同,并且该级别无法确定。 
    adXactChaos //指示不能覆盖来自更高级别隔离事务的挂起更改。 
    adXactBrowse //指示可以从一个事务中查看其他事务中未提交的更改。 
    adXactCursorStability //指示只能从一个事务中查看其他事务中提交的更改。 
    adXactRepeatableRead //指示不能从一个事务中查看其他事务中所作的修改,但是重新查询可以检索新的 Recordset 对象。 
    adXactIsolated //指示该事务与其他事务隔离执行。 
    ///////////////
    问题好像不在这里,试了还不行
    每次只要BeginTrans连接里做了更改,其他的连接再查询时就会“连接超时”;
      

  7.   

    不知道你那怎么回事,在我的电脑上开两个程序是没有问题的:
    第一个程序用事务添加数据,提交修改前,用第二个程序能正常选出所有数据,当第一个程序提交后,第二个程序再次查询的数据则为提交后的新数据了..不会出现"连接超时"的问题,我还是用的ACCESS,不知你用的什么数据库..另外,我没有设置pConn1-> Mode,pConn1-> IsolationLevel之类的属性,你把这些屏蔽掉再试试看..
      

  8.   

    to tabby:
      我原本用的是SQLServer2000,按上文中所说的方法测试后仍是不行,但改为Access环境测试则和你得出的结果一样,即BeginTrans事务对其他连接不影响;
      如果装了SQLServer2000的话,可以简单的这样测试,打开两个“查询分析器”,在一个中用Begin Tran开始一个事务,并对数据库做任一修改,例如:
      //
      //...testdb/jobs;(job_desc,min_lvl,max_lvl)
      //
      begin tran test_db
      insert into jobs values('xx',100,200)
      //
    先不RollBack或Commit,再打开另外一个,执行简单的" select * from jobs ",会发现改命令会一直等待,直到第一个查询分析器里执行了回滚或提交;
      
       不知道是什么原因,在SQLServer和Access里结果不同,是不是SQLServer里需要某些特殊的设置?。。?
    期待答案ing...