Este é o site histórico da documentação 4D. As documentações estão sendo movidas progressivamente para developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20
SYNCHRONIZE
|
SYNCHRONIZE |
||
O comando SYNCHRONIZE permite sincronizar duas tabelas localizadas em dois servidores 4D SQL diferentes. Toda mudança realizada em uma das tabelas também é realizada no outro. O servidor 4D SQL que executa o comando se chama servidor local e o outro servidor se chama servidor remoto.
O comando SYNCHRONIZE é uma combinação de duas chamadas internas ao comando REPLICATE. A primeira chamada replica os dados desde o servidor remoto ao servidor local e a segunda realiza a operação inversa: replicação dos dados do servidor local ao servidor remoto. As tabelas a sincronizar devem estar configuradas para a replicação
Para maior informação, consulte a descrição do comando REPLICATE.
O comando SYNCHRONIZE aceita quatro marcadores (stamps) como "parâmetros": dois marcadores em entrada e dois marcadores em saída (última modificação). Os marcadores de entrada se utilizam para indicar o momento da última sincronização em cada servidor. Os marcadores de saída devolvem o valor dos marcadores de modificação em cada servidor justo depois da última modificação. Graças a este princípio, quando o comando SYNCHRONIZE se chama regularmente, é possível usar os marcadores de saída da última sincronização como marcadores de entrada para a seguinte.
Nota: Os marcadores de entrada e de saída se expressam como valores numéricos (stamps) e não de marcadores de tempo (timestamps). Para obter mais informação sobre estes marcadores, consulte a descrição do comando REPLICATE.
Em caso de erro, o marcador de saída do servidor em questão contém o marcador do registro a origem do erro. Se o erro deve ser a uma causa diferente a sincronização (problemas de rede por exemplo), o marcador conterá 0.
Há dois códigos de erro diferentes, um para indicar um erro de sincronização no site local e outro para um erro de sincronização no site remoto.
Quando ocorre um erro, o estado dos dados dependerá da transação no servidor local. No servidor remoto, a sincronização se realiza sempre dentro de uma transação, de forma que os dados não possam ser alterados pela operação. No entanto, no servidor local, o processo de sincronização fica sob o controle do desenvolvedor. É realizado fora de qualquer transação se a preferência Transações Auto-commit não está ativada, (caso contrário, um contexto de transação é criado automaticamente). O desenvolvedor pode optar por iniciar uma transação e é responsabilidade do desenvolvedor validar ou cancelar esta transação depois da sincronização dos dados.
Pode "forçar" o endereço de sincronização utilizando as cláusulas REMOTE OVER LOCAL e LOCAL OVER REMOTE, dependendo das características de sua aplicação. Para maior informação sobre os mecanismos de implementação, consulte a descrição do comando REPLICATE.
Nota: As operações realizadas pelo comando SYNCHRONIZE não levam em consideração restrições de integridade dos dados. Isto significa, por exemplo, que as regras que regem as chaves externas, singularidade, etc. não são verificadas. Se os dados recebidos podem afetar a integridade de dados, deve verificar os dados depois da operação de sincronização. A forma mais simples é bloquear, via a linguagem 4D ou SQL, os registros que devem ser modificados.
Para entender os mecanismos envolvidos na operação de sincronização, vamos a examinar as diferentes possibilidades relativas a atualização de um registro existente nas duas bases sincronizadas.
O método de sincronização é da seguinte forma:
C_LONGINT(vRemoteStamp)
C_LONGINT(vLocalStamp)
C_LONGINT(vLatestRemoteStamp)
C_LONGINT(vLatestLocalStamp)
vRemoteStamp:=X... // ver valores no array a continuação
vLocalStamp:=X... // ver valores no array a continuação
vLatestRemoteStamp:=X... // valor devolvido em um anterior LATEST REMOTE STAMP
vLatestLocalStamp:=X... // valor devolvido em um anterior LATEST LOCAL STAMP
Begin SQL
SYNCHRONIZE
LOCAL MYTABLE (MyField)
WITH
REMOTE MYTABLE (MyField)
FOR REMOTE STAMP :vRemoteStamp,
LOCAL STAMP :vLocalStamp
LOCAL OVER REMOTE // or REMOTE OVER LOCAL, ver no array a continuação
LATEST REMOTE STAMP :vLatestRemoteStamp,
LATEST LOCAL STAMP :vLatestLocalStamp;
End SQL
Os dados iniciais são:
LOCAL | REMOTE | ||
Antigo valor | Novo valor | Antigo valor | Novo valor |
AAA | BBB | AAA | CCC |
Estas são as sincronizações realizadas pelo comando SYNCHRONIZE em função dos valores passados nos parâmetros LOCAL STAMP e REMOTE STAMP como também a opção de prioridade utilizada: ROL (para REMOTE OVER LOCAL) ou LOR (para LOCAL OVER REMOTE):
LOCAL STAMP | REMOTE STAMP | Prioridade | LOCAL depois de sinc | REMOTA depois de sinc | Sincronização LOCAL - REMOTA |
20 | 3000 | ROL | CCC | CCC | <----> |
20 | 3000 | LOR | BBB | BBB | <----> |
31 | 3000 | ROL | CCC | CCC | <-- |
31 | 3000 | LOR | CCC | CCC | <-- |
20 | 4001 | ROL | BBB | BBB | --> |
20 | 4001 | LOR | BBB | BBB | --> |
31 | 4001 | ROL | BBB | CCC | Sem sincronização |
31 | 4001 | LOR | BBB | CCC | Sem sincronização |
40 | 3000 | ROL | CCC | CCC | <-- |
40 | 3000 | LOR | CCC | CCC | <-- |
20 | 5000 | ROL | BBB | BBB | --> |
20 | 5000 | LOR | BBB | BBB | --> |
40 | 5000 | ROL | BBB | CCC | Sem sincronização |
40 | 5000 | LOR | BBB | CCC | Sem sincronização |
Produto: 4D
Tema: Comandos SQL
Manual de SQL ( 4D v20)