ADO中BeginTrans()对其他用户(连接)的影响解决办法
ADO中BeginTrans()对其他用户(连接)的影响
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环境下;
------解决方案--------------------
当然可以..只是说事务提交了以后,再能保证别的连接查询的是最新数据
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环境下;
------解决方案--------------------
当然可以..只是说事务提交了以后,再能保证别的连接查询的是最新数据