多线程操作数据库,经常出现 "无法更新;当前被锁定"的错误
我做了一个程序有两个线程,一个主线程,共3个线程操作数据库,
3个线程都加了CoInitialize(NULL);
而且都如下初始化了连接指针
_ConnectionPtr m_pConn;
HRESULT hr;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->ConnectionString=ACCESS_CONNSTR;
m_pConn->ConnectionTimeout=20;
try
{
hr=m_pConn->Open("","","",-1);
}
catch(_com_error e)
{
..............
}
if(FAILED(hr))
{
..............
}
主线程m_pConn是类里的公有变量,其余线程操作数据库时是通过函数传参A(...,_ConnectionPtr m_pConn)来传递指针.
void A(....,_ConnectionPtr m_pConn)
{
_RecordsetPtr m_pRst(__uuidof(Recordset));
_bstr_t vSQL;
vSQL="select * from HistoryRcd where 学号="+stage+" and ..... and .....";
CPCriticalSection.Lock();
try
{
m_pRst->Open(
(_bstr_t)vSQL,m_pConn.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
CPCriticalSection.Unlock();
CString errormessage;
errormessage.Format("%s%s",e.ErrorMessage(),(LPSTR)(LPCSTR)e.Description());
AfxMessageBoxZ(errormessage);
BoolMsg=false;
return ;
}
}
存储数据库是用如下代码
try
{
ado_balance.Format("%d",SetBalance);
m_pRst->PutCollect("分数",_variant_t(ado_balance));
m_pRst->Update();
}
catch(_com_error e)
{
CPCriticalSection.Unlock();
CString cstemp;
MessageBox(NULL,e.Description(),"",0); //无法更新;更新被锁定,报错就是这里报错
return false;
}
最后释放指针
CPCriticalSection.Unlock();
m_pRst->Close();
m_pRst.Release();
现在基本可以说是无规律的出现 "无法更新;更新被锁定"的提示,请问都会有什么情况会出现这种现象?
我感觉不象是临界区的问题,我检查了遍,没发现3个临界区没有锁定的问题,当然也不排除我大脑漏电的可能.
难道是因为我没有做数据库的读写共享?现在我的VC书被别人借去了,去网上搜又搜不到共享该怎么做,能帮忙给个读写共享的代码吗?
查了两天了,真的头都大了,帮忙想想可能出现的情况吧,谢谢