我要做一个库存管理方面的系统, 产品的用户单号一定要保正唯一,单号的产生是由表里最大的编号加1,。为了避免多个用户并行操作时有可能出现相同编号的错误,我作以下代码,但很怀疑它的效率。请高手和有经验的人给我指点一下。 try
{
HRESULT hr;
_ConnectionPtr pConn;
_RecordsetPtr pRs, pRs2;
pConn.CreateInstance(_T(__uuidof(Connection)));
pConn->IsolationLevel = adXactIsolated;
pConn->Open((LPCTSTR)::csxGetSQLConn(), _T(""), _T(""), -1);
pRs.CreateInstance(__uuidof(Recordset));
hr = pConn->BeginTrans();
pRs->Open(_T("csInStock"), (LPDISPATCH)pConn, adOpenDynamic, adLockPessimistic, adCmdTable);
pRs2.CreateInstance(__uuidof(Recordset));
pRs2->Open(_T("Select top 1 * from csInStock order by cID desc"), (LPDISPATCH)pConn, adOpenStatic, adLockPessimistic, adCmdText);
pRs->Close();
pRs.Release();
pConn->RollbackTrans();
}
catch(_com_error &e)
{
}
当一个用户执行到
pRs->Open(_T("csInStock"), (LPDISPATCH)pConn, adOpenDynamic, adLockPessimistic, adCmdTable);
这里时就会把csInstock这个表锁定,如果其它也同样调用这个表时就会给Block了直到前一个用户的事务给Commit哐Rollback后才能返回。因为csInStock是入库表,如果入库数据量很大的时候会不会很影响效率?
{
HRESULT hr;
_ConnectionPtr pConn;
_RecordsetPtr pRs, pRs2;
pConn.CreateInstance(_T(__uuidof(Connection)));
pConn->IsolationLevel = adXactIsolated;
pConn->Open((LPCTSTR)::csxGetSQLConn(), _T(""), _T(""), -1);
pRs.CreateInstance(__uuidof(Recordset));
hr = pConn->BeginTrans();
pRs->Open(_T("csInStock"), (LPDISPATCH)pConn, adOpenDynamic, adLockPessimistic, adCmdTable);
pRs2.CreateInstance(__uuidof(Recordset));
pRs2->Open(_T("Select top 1 * from csInStock order by cID desc"), (LPDISPATCH)pConn, adOpenStatic, adLockPessimistic, adCmdText);
pRs->Close();
pRs.Release();
pConn->RollbackTrans();
}
catch(_com_error &e)
{
}
当一个用户执行到
pRs->Open(_T("csInStock"), (LPDISPATCH)pConn, adOpenDynamic, adLockPessimistic, adCmdTable);
这里时就会把csInstock这个表锁定,如果其它也同样调用这个表时就会给Block了直到前一个用户的事务给Commit哐Rollback后才能返回。因为csInStock是入库表,如果入库数据量很大的时候会不会很影响效率?
使用_CommandPtr来执行sql语句.