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环境下;
{
_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环境下;
解决方案 »
- SetTimer的时间精度问题
- CURL curl_easy_perform返回WRITE_ERROR
- 怎样知道MFC中哪个类定义在哪个头文件里面?
- 字符指针指向CString 对象,该如何转换,在线等待,望大侠教我,谢谢
- 如何制作软件使用次数计数器,请大家指教一下?
- 请问如何delete一个CImageList
- Rigel(猎户座-参宿七) 辞职了,高兴啊,散分了!(9)
- 又穿一层马甲,再放200分——顺便问一个大家职业生涯都可能遇到的问题
- 用什么方法得到当前系统的所有硬件信息(就像设备管理器一样)?
- 一个大学生的困惑!
- 如何通过计算机名获取局域网内其它机器的ip地址
- Assert Failed! 高手请看看
adXactChaos //指示不能覆盖来自更高级别隔离事务的挂起更改。
adXactBrowse //指示可以从一个事务中查看其他事务中未提交的更改。
adXactCursorStability //指示只能从一个事务中查看其他事务中提交的更改。
adXactRepeatableRead //指示不能从一个事务中查看其他事务中所作的修改,但是重新查询可以检索新的 Recordset 对象。
adXactIsolated //指示该事务与其他事务隔离执行。
///////////////
问题好像不在这里,试了还不行
每次只要BeginTrans连接里做了更改,其他的连接再查询时就会“连接超时”;
第一个程序用事务添加数据,提交修改前,用第二个程序能正常选出所有数据,当第一个程序提交后,第二个程序再次查询的数据则为提交后的新数据了..不会出现"连接超时"的问题,我还是用的ACCESS,不知你用的什么数据库..另外,我没有设置pConn1-> Mode,pConn1-> IsolationLevel之类的属性,你把这些屏蔽掉再试试看..
我原本用的是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...