O que é um bom esquema para sincronização de banco de dados multiusuário?

5

Estou trabalhando em um sistema para permitir que vários usuários colaborem em um projeto on-line. Tudo é bastante simples, exceto para manter os usuários em sincronia. Cada usuário tem sua própria cópia local do banco de dados do projeto, o que permite que eles façam alterações e testem as coisas e, em seguida, enviem as atualizações para o servidor central. Mas isso se depara com a clássica questão de sincronização: como você impede que dois usuários editem a mesma coisa e pise no trabalho um do outro?

Eu tenho uma ideia que deve funcionar, mas me pergunto se há uma maneira mais simples de fazer isso. Aqui está o conceito básico:

  • Todos os dados do projeto são armazenados em um banco de dados relacional.
  • Cada linha no banco de dados tem um proprietário. Se o usuário atual não for o proprietário, ele poderá ler, mas não escrever a linha. (Isso é imposto pelo lado do cliente.)
    • O usuário pode enviar uma solicitação ao servidor para apropriar-se de uma linha, que será concedida se a cópia do servidor informar que o proprietário atual é NULL ou para liberar a propriedade quando terminar.
    • Não é possível liberar a propriedade sem confirmar alterações no servidor.
  • Não é possível confirmar alterações no servidor sem antes fazer o download de todas as alterações pendentes no servidor.
  • Quando qualquer alteração é feita nas linhas que você possui, um acionador marca essa linha como Dirty. Quando você confirma alterações, o banco de dados é verificado para todas as linhas Sujas em todas as tabelas e os dados são serializados em um arquivo de atualização, que é postado no servidor, e todas as linhas são marcadas como Limpo. O servidor aplica as atualizações em seu final e mantém o arquivo ao redor. Quando outros usuários baixam as alterações, o servidor envia os arquivos de atualização que eles ainda não receberam.

Portanto, essencialmente, isso é uma reinvenção do controle de versão em um banco de dados relacional. Desde que tomar posse e aplicar atualizações ao servidor são garantidas mudanças atômicas, e o servidor verifica se algum usuário do smart-aleck não editou seu banco de dados local para que ele possa enviar uma atualização para uma linha que ele não usa. t ter a propriedade de, deve ser garantido para ser correto e sem necessidade de se preocupar com conflitos de mesclagem e mesclagem. (Eu acho).

Alguém pode pensar em algum problema com esse esquema ou em maneiras de fazer melhor? (E não, "construa [insira o VCS aqui] no seu projeto" não é o que estou procurando. Já pensei nisso. Os VCSs funcionam bem com texto, e não tão bem com outros formatos de arquivo, como relacional bases de dados.)

    
por Mason Wheeler 02.11.2012 / 00:24
fonte

1 resposta

2

Criamos um aplicativo muito semelhante há vários anos e usamos praticamente a mesma abordagem.

A única coisa que voltou a nos morder foi que acabamos com muitos registros atribuídos a um usuário que essencialmente foram abandonados. Os usuários solicitaram a propriedade e, em seguida, nunca fizeram alterações e nunca liberaram a propriedade. Isso levou a registros no banco de dados que não puderam ser atribuídos a outros usuários.

Os usuários nem sempre fazem o que esperamos e, nesse caso, não previmos que um usuário inicie uma unidade de trabalho e, em seguida, pare. Tivemos que implementar um processo para redefinir a propriedade para null após o tempo X ter decorrido. Essa pode não ter sido a melhor solução, mas aconteceu dentro dos desejos do proprietário da empresa.

    
por 02.11.2012 / 13:33
fonte