|
|
|
|
|
Dicas
|
|
Visual Basic (Banco de Dados)
|
|
|
Título da Dica: Configurando o gerenciamento de Locks via ADO
|
|
|
|
Postada em 3/9/2003 por Ð@®l@n
Conforme é visto no treinamento de técnicas de desenvolvimento com Visual Basic, o ADO automaticamente impede que 2 usuários alterem em conjunto a mesma informação no servidor.
O ADO faz isso colocando na query de atualização uma clausula where pesquisando pelos valor original de todos os campos atualizados. Assim sendo, se alguém alterou o campo anteriormente o update não encontra a informação e a atualização falha, controlando assim a concorrência de dados.
Veja um exemplo :
rsCustomers.CursorLocation = adUseClient rsCustomers.Open "SELECT * FROM Customers", cnNWind, _ adOpenStatic, adLockOptimistic, adCmdText rsCustomers.Fields("CompanyName").Value = "Acme" rsCustomers.Update
Essa atualização fará com que o ADO envie para o banco a seguinte instrução :
UPDATE Customers SET CompanyName = 'Acme' WHERE CustomerID = 'ALFKI' AND CompanyName = 'Alfreds Futterkiste'
Observe que o ADO inseriu na instrução a chave primária e uma pesquisa pelo valor original do campo alterado. Até aqui, nenhuma novidade, isso é visto em nosso treinamento.
Mas essa forma de trabalho precisa ser configurável. Em alguns sistemas eu posso tanto precisar de mais segurança como de menos segurança :
A) Eu posso desejar sempre sobrepor os dados, mantendo a última atualização. Executar a query acima, neste caso, vira perda de performance
B) Eu posso desejar não permitir nenhuma alteração simultânea, ao invés de fazer a query apenas pelos campos alterados fazer por todos, gerando um erro caso qualquer campo do registro tenha sido alterado por outro usuário antes desta gravação.
Para realizar esta configuração existe uma propriedade dinâmica do recordset chamada "Update Criteria". Veja os valores que ela pode receber :
adCriteriaKey = 0
Utiliza somente a chave primária. Neste caso os dados serão sempre sobrepostos
adCriteriaAllCols = 1
Utiliza todas as colunas no critério. Neste caso qualquer alteração nos campos do registro será identificada.
adCriteriaUpdCols = 2 (Default)
Utiliza apenas as colunas que forem atualizadas no critério. Se outra coluna houver sido atualizada, isso não será identificado, gerando uma mesclagem do registro.
adCriteriaTimeStamp = 3
Utiliza apenas a coluna de timestamp (recurso do sql server) para atualização. Tem o mesmo efeito que adCriteriaAllCols mas com uma performance muito melhor.
Veja a síntaxe :
rs.properties("update criteria").value=adcriteriakey
Mais informações em http://support.microsoft.com/default.aspx?scid=kb;EN-US;q190727
|
|
|
|
|