1、事务是为了完成一个特定的功能或任务而要进行的一系列的处理步骤,事务代表了所需的系列动作的整体。一个事务的所有语句被作为整体执行,遇到错误时,可以回滚事务、取消事务内所做的所有改变。在数据库中,事务可以把多个操作作为单一的、最基本的活动来进行。
2、ADO使用connection对象处理事务:
(1)、在事务开始时调用
pCnn->BeginTrans();
(2)、在事务结束并成功时调用
pCnn->CommitTrans ();
(3)、在事务结束并失败时调用
pCnn->RollbackTrans ();
3、ADO在Oracle中使用事务举例:
/* 功能:在删除租借记录时,第一步需要删除tbRentInfo表中的记录,第二部需要将 tbDVDInfo中DVD的Num值加1,两者要么都成功,要么都不成功,这样才能保 整DVD影碟总数始终一致,将两步放在一个事务中处理。 方法:调用connection对象的三个方法:BeginTrans()、CommitTrans()、RollbackTrans()。 */ void CRentMgrDlg::DeleteRecordByConnectionTrans(CString &sID,CString &sName) { BOOL bRet(FALSE); HRESULT hr; _variant_t RecordsAffected; CString strsql; strsql.Format(_T("delete from tbRentInfo where SID = %s"),sID); try { /*开始事务处理*/ m_pConnection->BeginTrans(); do { /*第一步:*/ hr = m_pConnection->Execute(_bstr_t(strsql), &RecordsAffected, adCmdText); if (FAILED(hr)) break; /*第二步:*/ /*使用记录集对象查询数目,并更新数目*/ _RecordsetPtr pRecordset; hr = pRecordset.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) break; /*查询原始数目*/ CString strDVDID,strValue; int nDVDID,dvdNum; nDVDID = QueryDVDId(sName); strDVDID.Format(_T("%d"),nDVDID); strsql.Format(_T("select* from tbDVDInfo where SDVDID = %s"),strDVDID); hr = pRecordset->Open(_variant_t(strsql), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if(FAILED(hr)) break; if(pRecordset->EndOfFile) break; /*更新数目*/ _variant_t var; var = pRecordset->GetCollect("sNum"); if(var.vt != VT_NULL) { strValue = (LPCSTR)_bstr_t(var); dvdNum = _ttoi(strValue); dvdNum += 1; strValue.Format(_T("%d"), dvdNum); pRecordset->PutCollect("sNum", _variant_t(strValue)); pRecordset->Update(); } else { break; } bRet = TRUE; } while (FALSE); } catch(_com_error *e) { m_pConnection->RollbackTrans(); MessageBox(e->ErrorMessage()); } if(bRet) m_pConnection->CommitTrans(); else m_pConnection->RollbackTrans(); }