摘 要 事务处理是维护数据库应用系统中数据一致性的重要方式。本文分析了几种在分布式系统中实现事务处理的常用方法。结合城域点播系统,利用ADO事务处理技术提出了维护数据一致性的有效方案。
关键词 事务处理;VOD;ADO
数字电视城域点播系统是可覆盖全城的扩展的分布式VOD系统,为用户提供方便快捷、稳定流畅的高画质VOD服务。该系统采用多层分布式系统架构,后台数据库搭建在SQL Server 2000之上,SQL Server 2000是可缩放、高性能的关系型数据库管理系统,提供强大的事务处理功能,对事务恢复主要采用基于事务日志机制来保证数据的完整性。由于系统面向更具体的要求和应用,SQL Server 2000提供的隐性事务控制还不能完全满足系统的需要,而且还会造成应用程序性能下降。 因此,本文讨论了如何在该系统中实现更全面、更完善的显式事务控制,从而实现数据的一致性和完整性,保证整个系统的安全、有效的运行。
事务是一种能够把数据库的修改作为整体提交给数据库的机制,从而保证数据库的一致性。事务作为单个逻辑工作单元执行的一系列操作。必须具备四个属性:即原子性(Atomy) 、一致性(Consistency) 、隔离性( Isolability) 和持久性(Durability) ,称为 ACID属性。
在DB-Library 应用程序和 T-SQL 脚本中可以使用Begin Transaction ,Commit Transaction 等语句描述事务,SQL Server 2000 可以按显式、自动提交或隐性模式启动事务,用COMMIT 或 ROLLBACK结束事务。SQL server应用程序主要使用 Transact-SQL 语句或数据库 API 函数通过指定事务启动和结束的时间来控制事务。常用的数据库API 有ODBC、OLE DB 和ADO ,不同的数据库访问方式的效率和访问方式策略有不同,如 ADO 不支持隐性事务,OLE DB 没有专门用来设置隐性事务模式的方法。
多层结构系统由于其安全性、易扩展、易于实现分布式的数据处理方式等优势使其应用越来越广泛。多层系统中典型的是三层结构体系(如图1),客户端负责系统与用户的交互,企业逻辑,数据访问规则,合法性校验等放在应用服务器层,客户程序通过IAppServer接口与应用服务器通讯,通讯的协议可以是TCP/IP,DCOM,MTS或CORBAT。应用服务器通过数据集控件访问数据库服务器。
图1 三层体系结构
2.2.1 事务处理集中于客户端
这种处理方式主要利用客户端的TClientDataSet组件,在其CommandText属性中定义事务,通过IAppServer接口将定义的SQL语句传给应用程序服务器中的数据集组件,数据集组件通过BDE访问远程数据库服务器,并把含有事务处理的SQL语句传给数据库服务器,这样实现事务的控制。
在正常情况下,系统可有效的控制事务,但若客户端在开始一个事务由于任何原因中断了客户端和数据库系统的通讯,由于此时数据表处于锁定状态,只有提交或回滚才能解锁,这必然影响到系统的正常运行。
2.2.2 在数据库服务器端控制事务
在数据库服务器后台,利用T-SQL语句定义存储过程或触发器来实现事务的控制.当应用服务器通过调用组件的方式执行相应存储过程时,数据库将自动完成数据的修改,从而实现事务的控制。但由于存储过程和数据集控件绑定,这将影响松散耦合系统的维护和功能的扩展,而且为满足系统不同的功能需求,数据库服务器将定义更多的存储过程或触发器来实现系统功能,这对数据库服务器的移植和维护带来一定的困难。
2.2.3 在应用服务器控制事务
在中间层实现事务,由远程提交数据包给中间层由中间层来进行企业逻辑判断和事务处理,客户端只负责提交数据包,不进行企业逻辑判断,数据包提交后即使网络中断中间层也可继续进行企业逻辑判断和事务处理,因为中间层处理时间短,不会影响其它用户。而且,后台数据库本身并不执行太多的操作,这将提高整个系统的执行效率。下面具体讨论如何在城域点播系统应用服务器中实现事务处理。
该系统软件开发环境选用Delphi7.0 + SQL Server 2000,采用C/S三层结构模式,客户端和应用服务器之间采用CORBA协议,实现在不同开发语言环境和异构系统之间数据交互,保证了整个系统运行的稳定性、高效性和安全性。软件体系具体分成以下部分(如图2):
1) 应用服务器端:呼叫服务中心(Call Center),是整个系统控制的中心,主要实现用户点播业务,启动点播服务器,与VOD点播服务器、运营管理中心保持通信,回复客户的各种信息查询要求等等。在内部实现上,主要由23个动态连接库(DLL)组成,其中CustomManager.dll动态库主要实现对用户信息管理,底层数据库模块VODDateBase.dll主要负责与数据库的连接和数据的处理和执行。
2) 数据库服务器端:SQL server 2000;主要存储系统数据、节目数据、用户数据等。
3) 客户端:用户接入服务器(ESNP/SM Server)、视频服务器群(VOD Servers)、用户管理模块(User Management)、运营管理模块(SysRun Management)、系统管理模块(System Management)、节目管理模块(Media Management)、系统监控模块(SystemMonitor)等。
系统结构图如下:
图2 城域点播系统结构图客户端和服务器端利用CORBA协议进行通信,当客户端发出请求时, CallCenter通过调用内部相应动态连接库DLL接口负责响应客户端请求,DLL中相应函数将需处理的数据信息写入TClientDataSet,然后CallCenter调用底层数据库操作模块(VodDataBase模块),执行参数TClientDataSet中的信息,实现数据库相应操作。
3.2.1 数据库操作模块(VodDataBase类)的设计和实现
图3 VodDataBase类图
VodDataBase类封装了系统对数据库操作的成员变量(FConnectMod)和函数:
1) 成员变量(FConnectMod):TConnectMod类封装数据库连接组件,连接方式(如图4)所示:
图4 数据库连接组件
TADOConnection 类封装了ADO 连接对象, 通过设置 connectionstring 属性连接数据库服务器,方法BeginTrans, CommitTrans, RollbackTrans用来控制事务, IsolationLevel 属性用来设置事务隔离级别,隔离级别值有九个(此处设置为ilIsolated ), TADODataSet是ADO数据集部件,TDataset Provider属于远程数据模块,提供了客户端访问应用程序的接口,它将发送给客户端应用程序的数据信息打包,同时把客户端对数据进行的更新在数据库服务器上的实现。
2) 成员函数:TVodDataBase类的成员函数封装了对数据库操作的实现。其中事务操作函数为:VodDataBase_ Begintrans、VodDataBase_ CommitTrans和VodDataBase_ RollbackTrans:它们通过调用ADOConnection组件的事务处理方法的相应函数处理事务和获得事务嵌套级别。另外需要做的一项重要工作是判断事务执行状态,借助于异常处理编程语句,当接收异常时回滚事务,否则提交事务。
3.2.2 事务处理的程序实现
下面以用户管理模块中的添加用户方法为例说明程序的实现:
数据库中与用户相关的表有:CustomInfotbl记录点播用户基本信息,CustomBundledPhoneNum记录用户绑定的电话信息,CustomAccounttbl记录用户的帐务信息,CustomVod Paytbl记录用户点播费用。
当客户端系统管理模块执行添加用户操作时,服务器端调用相应动态库 CustomManager.dll的AddNew函数,将开户成功的用户信息(姓名、住址、绑定电话号码、密码等等)添加到数据库系统中。AddNew函数具体实现代码为:
function TCustomerManager_Inner.Customer_AddNew
(ValCustomerInfo : TCustomerInfoRecord) : HResult;
var
ValClientDataSet:TClientDataSet;
Begin
Try
//生成数据库操作对象,并连接数据库
VodDataBase:=TVodDataBase .create;
ValClientDataSet:=TClientDataSet.Create(nil);
VodDataBase_ BeginTrans;//显式启动一个事务
Try
//加入信息到CustomInfotbl表中
ValClientDataSet.CommandText:=’insert into CustomInfotbl values (ValCustomerInfo.CustomerID,……….)’
//判断数据库操作是否成功
If VodDataBase.exeSql(ValClientDataSet)=0 then
Begin
//加信息到CustomAccounttbl
AddNewInfoIntoCustAccountTbl(ValCustomerInfo)
//加信息到CustomVodPaytbl
AddNewIDIntoVodPayTbl(VaCustomerInfo);
//加入信息到CustomBundledPhoneNum
AddBundledInfo(ValCustomerInfo);
………
//全部执行成功
VodDataBase.commitTrans;
End;
except
on e:Exception do
begin
//若其中一个操作失败
VodDataBase.rollbackTrans;
end;
end;
finally
//释放对象
ValClientDataSet.Free;
VodDataBase.destroy;
end;
End;
函数操作开始时,开启事务,即将后面的所有操作置于一个事务之中,若事务内任何一个操作在执行过程中出现错误,整个事务将回滚,事务回到最初状态。当事务内所有对数据库的修改和操作都成功时,整个事务才提交,从而保证事务ACID属性。
以上对事务处理技术在分布式系统中实现的几种方案进行了分析和比较,并结合城域点播系统着重分析和实现了在应用服务器端维护和控制事务。测试表明:在系统实际运行过程中,可以有效的维护事务的一致性和完整性,从而确保整个系统的安全、有效的运行。随着整个系统由中心数据库向分布式数据库扩展,必将涉及到更复杂的事务控制(如分布式事务处理)来维护事务的ACID属性。系统也将在本方案的基础上作进一步的深入和完善。
[1]. [美] Connolly,T.等著;宁洪等译.数据库系统—设计. 实现和管理(第三版).北京:电子工业出版社,2004.1 .
[2].李维著.Delphi 5.x ADO/MTS/COM+ 高级程序设计篇[M].北京:机械工业出版社,2000.11
[3]. 潘林森,姚渝春. Sql server 数据库系统系统中数据完整性的控制方法.重庆师范大学学报.2004.6 35~38.
[4]. 张瑞昌,向世勇,赵嵩正.Delphi/Sql Server 事务处理编程技术.计算机应用研究.2004,12,249~250.