Base de Conhecimento

Salvando os dados de forma otimista

Quem salvar por último, ganhou. É assim que funciona a maioria das aplicações de banco de dados. E também é assim que o Firedac é configurado por padrão. Ele não verifica se os dados mudaram nesse ínterim. Em muitas aplicações de banco de dados, nada é feito com isso. Às vezes você se depara com aplicações com um sistema elaborado e personalizado para resolver este problema. Mas o Firedac tem uma opção com a qual você pode facilmente evitar isto, ou seja, UpdateMode nas Opções de Atualização.

Há três configurações possíveis que resolvem este problema através da cláusula WHERE da consulta de atualização.

  • upWhereKeyOnly: somente os campos chave primários são usados no WHERE. Esta é a configuração padrão. Como resultado, o último commit sempre sobregrava os dados do commit anterior com dados potencialmente obsoletos.
  • upWhereChanged: os campos alterados são adicionados à consulta como uma condição, juntamente com os campos-chave primários. Desta forma, a atualização só terá sucesso se os campos modificados no banco de dados ainda contiverem o valor original.
  • upWhereAll: todos os campos do registro são colocados no WHERE com seu valor original. Isto significa que a atualização só terá sucesso se nenhum dos campos tiver sido modificado no banco de dados. Esta é a forma mais restritiva.

Se um update falhar, Firedac levanta uma EFDException. O tratamento disto fica, no entanto, a seu critério. No entanto, ele evita facilmente que os dados sejam sobregravados – para surpresa dos usuários.

Naturalmente, você também pode resolver este problema com o travamento, embora haja diferenças. Com o travamento, você depende do que um banco de dados suporta nisto. A desvantagem do travamento também é que ninguém mais pode escrever na tabela ou registrar, desde que você o tenha travado. E, dependendo de suas configurações, nem mesmo lê-lo. Isto muitas vezes proporciona situações em que os usuários têm uma má experiência de desempenho, porque as consultas estão esperando que os registros sejam liberados.

Com o UpdateOptions.UpdateMode, isto pode ser tratado de uma maneira relativamente simples em uma aplicação existente. Se você definir a opção no nível de conexão, ela se aplica a todos os comandos por padrão, mas você também pode começar a definir isto por consulta ou tabela. Isto também permite uma abordagem gradual.

Written by Kees de Kraker
Diretor

Contato

Deixe-nos ajudá-lo a realizar seus sonhos.