计算机软件水平考试中级软件设计师综合资料(47)
2016-4-22编辑:ljnbset
事务处理
在客户/服务器应用程序中,事务控制用来维护数据一致性。Delphi中提供了事务的隐式和显式方法。隐式控制对写入数据库的数据的每一行都要进行事务控制,导致网络繁忙和程序性能下降;用显式控制能自定义开始、提交和终止事务的过程,因而网络开销小,性能高。
显式控制有两种方法:
1?利用Database控件
Database控件用于事务控制的属性是TransIsolation,方法有StartTranstion、Commit和Rollback。标准写法如下:
Databasel.starttransaction;
Try
Query.SQL.Clear; //具体处理
Query.SQL.Add('update databasename set gz=gz+1');
Query.ExecSQL;
Databasel.commit;
Except
Databasel.rollback; //遇异常,回滚
End;
2.直接利用远程SQL服务器的事务处理功能,把SQL语句通过Query控件传递到服务器上。当程序不用本地库时,可以使用这种方法,但要用在BDE将SQLPassThroughMode设置为NOT SHARED。程序中我们可采用如下结构:
IF MessageDlg('确认改标志位?'', mtConfirmation, [mbYes, mbNo], 0)=mrYes then
Begin
DoSQL:=0; //用一个变量做标志
Query.SQL.Clear; // 改状态。
Query.SQL.Add('update .... Set .....)');
While DoSQL=0 do
Try
Query.ExecSQL;
DoSQL:=1;
Except
IF MessageDlg(‘改状态时发生共享冲突,要重试吗 ',
mtConfirmation, [mbYes, mbNo], 0) =mrNo Then Exit;
end;
end;
3减小共享冲突的概率
在实际中还有一种情况也可能引起共享冲突,这就是缓存更新。应用程序往数据库中写数据,先放在本地的缓冲区里然后由BDE提交,这样在多用户情况下就可能发生数据同时由缓存向数据库提交的情况,引起共享冲突。所以对频繁修改的数据要取消缓存更新。
在数据库的应用中,利用临时表也能减小冲突的概率。利用SQL语句可以在服务器上建立临时表,临时表会在使用完后被系统自动删掉。
例如下面语句分别把查询结果和统计结果放入临时表:
SELECT * FROM DatabaseName INTO temp temptable..
SELECT city_id,COUNT(*) lzcount ,SUM(jour_amt) lzsum FROM db_connect
WHERE flag=“2" GROUP BY city_id ORDER BY city_id INTO TEMP tempdatabase'