ODBC中的同步与异步执行模式
1．引言 近年来，随着计算机局域网技术的不断发展，计算机体系结构已经发展到复杂而开放的客户机／服务器模式。对于客户机／服务器应用的开发，现在常用的前端开发工具有：VisualBasic、Delphi、PowerBuilder等。它们可通过ODBC接口访问服务器的SQLServer数据库服务器。 VisualBasic、Delphi、PowerBuilder等开发工具在使用ODBC2．0来编写程序时，通常会提供三种方法来进行数据库应用程序的方案设计： ·使用数据控制项 ·使用数据库对象变量进行编程 ·直接调用ODBC2．0API 在客户机／服务器模式下进行数据库应用程序设计时，仅用前两种方法往往是不够的。因为采用前两种方法，其执行模式对于程序员是透明的，而ODBC2．0访问数据库时存在同步与异步执行模式之分，故容易因设计不当，发生系统死锁。因此，在实际编程序时，我们需要采用第三种方法来解决由同步和异步执行模式所造成的问题。 2．同步和异步执行模式 ODBC2．0访问数据库时，有同步执行模式与异步执行模式之分。 所谓同步执行模式，是指语句在同步执行模式下，将始终保持对程序流的控制，直至程序结束。例如查询操作，客户机上的应用程序在向服务器发出查询操作的指令后，将一直等待服务器将查询结果返回客户机端后，才继续进行下一步操作，如图1所示。 图1同步执行模式 所谓异步执行模式，是指语句在异步执行模式下，各语句执行结束的顺序与语句执行开始的顺序并不一定相同。例如查询操作，客户机上的应用程序在向服务器发出了查询操作的指令后，将立刻执行查询语句的下一条语句，而不需要等到服务器将查询结果返回客户机端后，才继续进行下一步操作。如图2所示。 图2异步执行模式 在一些应用程序开发工具中，在其提供使用数据控制项和数据库对象变量进行编程的同时，并没有很好地考虑到同步执行模式与异步执行模式的重要区别。为了使程序运行速度更快，其语句执行的缺省模式为异步模式。对于一般程序员来说，如果他对同步执行模式与异步执行模式不了解的话，他往往会在对服务器发出一个操作语句（查询或读取一条记录等操作）后，立刻引用服务器返回的执行结果，或者对该结果进行下一步操作；在异步执行模式下，客户机上的后续语句是在该操作语句发出后接着执行的，但由于各种原因，服务器不一定能执行完该操作语句，并在后续语句执行前将结果返回客户机。因此，后续语句在引用前一操作语句的执行结果时，往往会因为该执行结果并不存在而引用了错误的值，造成系统错误或死锁。 3．解决方案 解决上面所提到的问题，可以采取以下两种方案： ①利用ODBC2．0API，将语句执行状态设置为同步执行模式。ODBC2．0API中，函数SQLSetStmtOption（）的功能是设置同步或异步执行模式。我们可以采用以下语句，将语句执行状态设置为同步执行模式： iRetCodeΚSQLSetStmtOption（hStmt，SQL－ASYNC－ENABLE，0） 其中，hStmt是一有效的语句句柄，常数SQL－ASYNC－ENABLE是所要设置的选项，参数0表示该选项（即异步执行模式）关闭。如果iRetCode返回SQL－SUCCESS，则表示语句执行状态已被设置为同步执行模式。 ②利用ODBC2．0API，将语句执行状态设置为异步执行模式，然后在程序中不断查询一个操作语句是否已经执行完毕。 ODBC2．0API中共有20多个函数支持异步执行，如上页表所示。 这些函数第一次调用后，将返回值SQL－STILL－EXECUTING，这时应用程序将继续执行后续语句。过了一段时间后，应该再次调用原函数，而且要注意：实参数应传入与第一次调用时相同的语句句柄，其他参数也应一样（但会被忽略）。如果函数返回值为SQL－SUCCESS，则表明该语句已经执行完毕；如果函数返回SQL－STILL－EXECUTING，则表明该语句仍在执行中。 我们可以用一个简单的例子说明如下： iRetCodeΚSQLSetStmtOption（hStmt，SQL－ASYNC－ENABLE，1） ′置语句执行模式为异步执行模式 iRetCodeΚSQLExecDirect（hStmt，″SELECT＊FROMemployees″，23） ．．．．．．′执行其他操作 iRetCodeΚSQLExecDirect（hStmt，″SELECT＊FROMemployees″，23） ′判断SQLExecDirect（）是否已执行完毕 If（iRetCodeΚSQL－STILL－EXECUTING）Then ．．．．．．′该语句未执行完，继续执行其他操作 Else If（iRetCodeΚSQL－SUCCESS）Then ．．．．．．′该语句已执行完，可对语句操作结果进行处理 EndIf EndIf 同步执行模式可以简化程序编制的复杂性，对ODBC2．0API不十分熟悉的程序员，可以不用过多地了解比较复杂的ODBC2．0API，而只需使用数据控制项和数据库对象变量来编写应用程序，使开发效率大大提高，但程序运行速度比不上异步执行模式的速度。 异步执行模式虽然在编程序时十分复杂，但在这种模式下可以进行多任务并行执行，使执行效率大大提高。 我们在编制应用程序时，应根据自身的情况，对这两种模式的使用进行划分，以便既提高程序运行的安全可靠性，又提高程序执行的效率。