使用CDatabase进行事务处理

来源:互联网 发布:男士轻奢服装品牌 知乎 编辑:程序博客网 时间:2024/05/22 06:39

程序清单9-21  使用ExecuteSQL()方法示例

CDatabase dbSchool;

dbSchool.Open( "School", FALSE, FALSE, "ODBC;" );

dbSchool.ExecuteSQL( “UPDATE Student SET ClassID=32 WHERE ClassID=32” );

dbSchool.Close();

9.2.8  使用CDatabase进行事务处理

由本章的9.1.2小节,我们知道数据库的完整性包括实体完整性和参照完整性。当数据库满足完整性规则时,又称数据库处于一致状态。为保证完整性,在插入和删除多张表的数据时,需要将某些操作作为一个整体来执行而不允许被打断,因此就出现了事务的概念。

事务允许把一些SQL语句作为一个整体来执行,如果事务中的一个SQL语句出错,整个事务都会失败,并回到事务执行前的状态。

事务具有原子性,一致性,隔离性和持久性。原子性是指事务作为一个操作单元,或者全部完成,或者全部不做。一致性是指事务将数据库从一个一致状态转换到另一个一致状态。隔离性是指一个正在执行的事务在结束前不会让其它事务看到自己的运行结果。持久性是指当事务完成后,它对数据库的操作结果是永久的,不能再被擦除。

使用MFC ODBC类时,为开始一个事务,应该调用CDatabase::BeginTrans(),然后调用CDatabase::ExecuteSQL()执行这个事务,或者使用从该CDatabase产生的CRecordset对象执行这个事务。事务的结束有两种:当所有的操作成功时,用CDatabase::CommitTrans()提交事务;当发生错误时,用CDatabase::RollBack()放弃事务,并回到事务执行前的状态。

程序清单9-22是使用CDatabase进行事务处理的一个例程,它向School数据库的Teacher表和Class表同时添加记录。

程序清单9-22  事务处理例程

CDatabase *pDB=new CDatabase;pDB->Open( _T("datasource"), FALSE, FALSE, _T("ODBC;UID=sa;PWD=1;"));try{if(pDB->BeginTrans())TRACE("Transaction started/n");elseTRACE("Error in starting transaction./n");pDB->ExecuteSQL(_T("INSERT INTO student VALUES (2 , 'ge', '女')"));//pDB->ExecuteSQL(_T("INSERT INTO Class VALUES (‘33’, ‘T0005’, ‘28’, ’86.1’)"));if(pDB->CommitTrans())TRACE("Transaction commited/n");elseTRACE("Error in committing transaction./n");}catch (CDBException *e){TRACE(e->m_strError);if(pDB->Rollback())TRACE ("Transaction rolled back/n");elseTRACE("Error in rolling back transaction./n");}pDB->Close();delete pDB;


原创粉丝点击