1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Aceder a registo de uma tabela BD (através do VS2010 C#) multiUtilizador

Discussão em 'Programação' iniciada por Vandong, 12 de Agosto de 2012. (Respostas: 3; Visualizações: 711)

  1. Vandong

    Vandong Power Member

    Boas,

    Estou aqui num dilema ao qual gostaria de saber a vossa opinião, então cá vai:

    Estou a desenvolver uma pequena aplicação a nível pessoal no Visual Studuio 2010 (linguagem C#) com ligação a BD Mysql. Ora na aplicação tenho uma ficha de clientes onde registo os clientes (os dados ficam armazenados na tabela Clientes da BD Mysql) e gostaria de bloquear a ficha (apenas no registo do cliente que estiver em edição) para que outro utilizador não possa alterar dados desse registo enquanto o utilizador que bloqueou não termine a edição isto é:

    Ficha de Cliente -> Onde cria, altera e elimino clientes (tabela cliente na BD Mysql)
    Imaginamos que o utilizador1 vai à ficha cliente e vai ao registo 10 (idCliente 10, NomeCliente: João, etc....) ao clicar no botão alterar (para adicionar nova informação ou alterar informação,...) bloquea-se apenas o registo 10, assim o utilizador2 ao entrar na ficha cliente poderia alterar dados de qualquer cliente menos o do 10 porque estava bloqueado para edição pelo o utilizador1.

    Primeiro pensei utilizar semáforos, mas isto não me parece correcto porque o recurso que quero bloquear é um registo e não a ficha cliente, por isso descartei esta opção.
    A única solução que me parece boa é criar um novo campo de nome Bloqueado por defeito está a 0 (0= não bloqueado e = 1 = bloqueado) na tabela Cliente. Quando um utilizador clica-se no botão alterar na ficha cliente o campo Bloqueado ficaria = 1 e através de código C# não permitia a edição desse registo até clicar em gravar ou cancelar....o que acham desta opção? existe uma outra?

    Obrigado,
    Cumps
     
  2. tripas

    tripas To fold or to FOLD?

    Ola,

    A solução que deve utilizar é uma tabela externa, onde deve guardar as informações relevantes.

    Chave do tuplo que está a ser editado
    Utilizador que fez o pedido
    Data do pedido
    Data de finalização do pedido (util para o time out)
    Informação do tuplo antes da edição (útil para auditoria, pode (deve) colocar a informação flat (não normalizada))
    Informação do tuplo após a edição (útil para auditoria, pode (deve) colocar a informação flat (não normalizada))

    Adicionalmente deves criar um stored procedure, para fazer o pedido de edição e verificar que não há pedidos pendentes para o tuplo que estas a editar. Nesta perta deves usar uma transação.
     
    Última edição: 12 de Agosto de 2012
  3. Vandong

    Vandong Power Member

    Obrigado pela a resposta.
    A tua solução não é nada mais nada menos que um histórico com os dados alterados (campos alterados, utilizador que alterou, data, hora, etc...), certo?
     
  4. tripas

    tripas To fold or to FOLD?

    Não, como "bónus" guarda o histórico — e já agora o nome é auditoria —, você é precisa de controlar a concorrência e o timeout. Dai ser necessário utilizar transações e tomar nota do timestamp, e já agora no stored procedure desactive escritas em paralelo nesta tabela ou faça o lock da tabela.
     
    Última edição: 12 de Agosto de 2012

Partilhar esta Página