当有同步请求发出且 MobiLink 服务器确定必须建立新连接时,将触发 begin_connection 事件并启动同步。
随着同步的进行,连接被放入连接池中,MobiLink 再次等待出现对当前脚本版本的同步请求。在一个连接被最终从连接池中删除之前,将触发 end_connection 事件。但是如果接收到另一个对同一脚本版本的同步请求,MobiLink 将在同一连接上处理下一个同步请求。有很多事件会对当前同步产生影响。
同步的主要阶段是上载和下载事务。上载和下载事务中包含的事件将在下面介绍。
上载事务应用从远程数据库上载的更改。
begin_upload 事件标志着上载事务的开始。上载事务是一个由两个部分组成的过程。首先上载所有远程表中的插入和更新操作,然后上载所有远程表中的删除操作。
end_upload 事件标志着上载事务的结束。
有关上载过程中所发生事件的详细信息,请参见编写用于上载行的脚本。
下载事务从统一数据库中读取行。它开始于 begin_download 事件。
下载事务是一个由两个部分组成的过程。对于每个表,首先下载删除操作,然后下载更新/插入行 (upsert)。end_download 事件结束下载事务。
有关下载过程中所发生事件的详细信息,请参见编写用于下载行的脚本。
下面的伪代码概述了调用各种事件以及随之调用同名脚本的序列。
下面的伪代码显示了完整的 MobiLink 同步事件模型。此模型假定存在一个没有出现错误的完整同步(而不是仅上载同步或仅下载同步)。
在大多数情况下,如果没有为给定事件定义脚本,则缺省操作是不执行任何操作。
begin_connection 和 end_connection 事件是连接级别的事件。它们独立于任何一个同步并且没有参数。
对于正在执行同步的每一个表,有些事件将在每个同步过程中被调用一次。与此类事件相关联的脚本被称为表级别的脚本。
尽管每个表都可以拥有自己的表脚本,但您也可以编写供多个表共享的表级别的脚本。
有些事件,如 begin_synchronization,在连接级别和表级别都会发生。您可以为这些事件提供连接级别和表级别的脚本。
COMMIT 语句说明了如何将同步过程分解为不同的事务。
数据库错误可能会在同步过程中的任何时刻发生。数据库错误使用 handle_error 或 handle_odbc_error 脚本进行处理。
警告在您的同步脚本中或从您的同步脚本调用的过程或触发器中,不应有任何隐式或显式提交。脚本内的 COMMIT 或 ROLLBACK 语句会改变同步步骤的事务性质。如果您使用这两个语句,在出现故障时您将无法保证数据的完整性。 |
------------------------------------------------------
Synchronization events in pseudocode.
Legend:
- // This is a comment
- <name>
The pseudo code for <name> is listed separately
in a later section, under a banner:
------------------------
name
------------------------
- VariableName <- value
Assign the given value to the given variable name.
Variable names are in mixed case.
- event_name
If you have defined a script for the given event name,
it will be invoked.
------------------------------------------------------
CONNECT to consolidated database
begin_connection_autocommit
begin_connection
COMMIT
for each synchronization request with
the same script version {
<synchronize>
}
end_connection
COMMIT
DISCONNECT from consolidated database
------------------------------------------------------ synchronize ------------------------------------------------------ <authenticate> <begin_synchronization> <upload> <prepare_for_download> <download> <end_synchronization>
------------------------------------------------------
authenticate
------------------------------------------------------
Status <- 1000
UseDefaultAuthentication <- TRUE
if( authenticate_user script is defined ) {
UseDefaultAuthentication <- FALSE
TempStatus <- authenticate_user
if( TempStatus > Status ) {
Status <- TempStatus
}
}if( authenticate_user_hashed script is defined ) {
UseDefaultAuthentication <- FALSE
TempStatus <- authenticate_user_hashed
if( TempStatus > Status ) {
Status <- TempStatus
}
}
if( UseDefaultAuthentication ) {
if( the user exists in the ml_user table ) {
if( ml_user.hashed_password column is not NULL ) {
if( password matches ml_user.hashed_password ) {
Status <- 1000
} else {
Status <- 4000
}
} else {
Status <- 1000
}
} else if( -zu+ was on the command line ) {
Status <- 1000
} else {
Status <- 4000
}
}if( Status <= 2000 ) {
if( authenticate_parameters script is defined )
{
TempStatus <- authenticate_parameters
if( TempStatus > Status ) {
Status <- TempStatus
}
}
if( Status >= 3000 ) {
ROLLBACK
// Abort the synchronization.
} else {
// UserName defaults to MobiLink user name
// sent from the remote.
if( modify_user script is defined ) {
UserName <- modify_user
// The new value of UserName is later passed to
// all scripts that expect the MobiLink user name.
}
COMMIT
}
------------------------------------------------------
begin_synchronization
------------------------------------------------------
begin_synchronization // conection event
for each table being synchronized {
begin_synchronization // call the table level script
}
for each publication being synchronized {
begin_publication
}
COMMIT
------------------------------------------------------
end_synchronization
------------------------------------------------------
for each publication being synchronized {
if( begin_publication script was called ) {
end_publication
}
}
for each table being synchronized {
if( begin_synchronization table script was called ) {
end_synchronization // table event
}
}
end_synchronization // connection event
for each table being synchronized {
synchronization_statistics // table event
}
synchronization_statistics // connection event
for each table being synchronized {
time_statistics // table event
}
time_statistics // connection event
COMMIT有关上载流处理的详细信息,请参见上载过程中的事件。
有关下载流处理的详细信息,请参见下载过程中的事件。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。