NetBox 2.7 使用手册

基于事件实现数据库事务处理

在商务应用中,经常需要访问数据库,以完成对数据的查询、插入、更新、删除等操作。受应用逻辑的影响,有时需要将多条数据库操作指令组成一个工作单元(事务)。在数据库中,所谓事务是指一组逻辑操作单元,它使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,应当用离散的成组的逻辑单元操作数据:当它全部完成时,数据的一致性可以保持;而当单元中的一部分操作失败时,整个事务会被全部忽略,所有从起始点以后的操作全部退回到开始状态。

NetBox 在 Windows 2000 以后的操作系统中支持基于 MTS 的事务处理,然而出于移植性、应用程序性能(MTS 是一个缓慢的操作)与应用复杂程度的考虑,你可以使用 ADO 数据库的事务处理结合 NetBox 特有的脚本事件建立完美的事务处理框架。

第一步:ADO 事务处理

ADO 的 Connection 对象提供三个方法用以进行事务处理:

BeginTrans:启动一个事务
CommitTrans:完成/提交一个事务
RollBackTrans:撤消/放弃一个事务

下面的代码创建一个连接并启动事务处理:

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

Conn.CommitTrans

使用这种方式必须保证在结束脚本之前调用 CommitTrans 方法,比如调用 Shell.QuitResponse.End 提前结束脚本。

第二步:使用 OnScriptEnd 保证提交

NetBox 的脚本支持 OnScriptEnd 事件,当脚本正常结束时,将自动触发,所以我们可以在这个事件中进行事务提交。实现代码如下:

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

在上面的代码中,程序结束时的事务提交被转移到了 OnScriptEnd 事件中,这样,无论脚本从什么位置正常退出脚本运行,都将提交整个事务。

第三步:使用 err.Raise 中止事务

在事务处理中,可能会出于一些原因需要中止事务。为了中止事务,可以使用 err.Raise 报告错误,从而使脚本非正常结束。

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

err.Raise errCode, errSource, errDescription

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

与此类似,当脚本在事务处理过程中发生任何未被捕捉的错误时,同样也会导致脚本非正常结束。

第四步:使用 OnScriptError 进行错误处理

在程序抛出错误,或者运行时间出错时,脚本程序将非正常结束,为了在脚本出错时撤消事务和进行其他错误处理,可以使用 OnScriptError 事件。

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

err.Raise errCode, errSource, errDescription

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

Sub OnScriptError
    Conn.RollBackTrans
    ......
End Sub

说明

本文给出的事务处理的方案适用于简单任务的事务处理,如果程序结构比较复杂,需要实现较复杂的或者多个事务处理,则需要根据需求自行进行事务的启动、提交和撤消。


版权所有: 2003- 网络盒子