我要做一个库存管理方面的系统, 产品的用户单号一定要保正唯一,单号的产生是由表里最大的编号加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是入库表,如果入库数据量很大的时候会不会很影响效率?

解决方案 »

  1.   

    把_connectionPtr设为全局变量,
    使用_CommandPtr来执行sql语句.
      

  2.   

    ZHENG017(风中王子) :如何用CommandPtr保证并行操作中的唯一呢?能详细些吗?
      

  3.   

    SQLServer支持自动递增变量,也就是说,你自己根本不用关心这个字段的重复问题,也不能自己设定这个值,他是自动递增的。如果采用Oracle的数据库,则需要写一个存储过程来实现。另外,如果要同时执行其他的写数据库的操作,最好是将操作写成存储过程,或者启动数据库的事务处理,这样才能保证你的数据的一致性。
      

  4.   

    还有可以用一个整形字段当id,设成primary key.主键不能重复的哈.