A série ORDA continua! Neste post de blogue, veremos como pode usar fechaduras nas suas bases de dados com conceitos ORDA! Não é raro precisar de gerir conflitos que possam ocorrer quando vários utilizadores ou processos carregam e/ou tentam modificar os mesmos registos ao mesmo tempo. O bloqueio de registos é uma metodologia utilizada em bases de dados relacionais para evitar actualizações inconsistentes dos dados.
A ORDA proporciona um modo de bloqueio optimista, para além daquele que já conhece (bloqueio pessimista).
Exemplo: como utilizar o bloqueio pessimista com ORDA
Different locking modes
GRAVES E ENTIDADES
Como lembrete, um registo é o registo físico na base de dados que é acedido através de uma entidade. Uma entidade é uma referência num registo (ver secção Entidade no glossário). Os registos são bloqueados e desbloqueados através de entidades.
Bloqueio óptimo
No bloqueio optimista, um registo é verificado antes de ser guardado para ver se outros processos o modificaram desde que o carregou numa entidade. O benefício é que o registo é bloqueado apenas durante o método de gravação.
O bloqueio óptimo depende do carimbo dos registos. Cada registo tem um carimbo interno que é automaticamente aumentado cada vez que o registo é guardado na base de dados. Se um registo tiver sido actualizado desde que carregou uma entidade, os métodos save(), drop(), e lock() devolverão um código de estado específico indicando que o carimbo mudou. Terá então de decidir o que fazer para lidar com este conflito.
Por defeito, a ORDA funciona com bloqueio optimista, mas o bloqueio pessimista também está disponível.
EXEMPLO
C_OBJECT($employee;$statusSave)
// Get the first employee whose last name is "Wates"
$employee :=ds.Employee.query("lastName=:1"; "Wates").first()
If ($employee#Null)
// Set name to "Mac Arthur"
$employee .lastName:="Mac Arthur"
// Salvar empregado
$statusSave :=$employee.save()
// Test if the save is successful If ($statusSave.success)
ALERT ("Salvado com sucesso!")
End if
End if
// O registo na base de dados foi actualizado
Tenho a certeza que está ansioso por saber mais sobre o bloqueio optimista. Outro post no blogue, totalmente dedicado a este conceito, está a chegar em breve. Fiquem atentos!
Pessimistic locking
No modo de bloqueio pessimista , os registos são bloqueados quando são lidos para que outros processos não os possam actualizar. Isto assegura que um registo modificado pode ser escrito à custa do bloqueio de registos a outros utilizadores. O registo é bloqueado mesmo quando não há acesso simultâneo.
Com o bloqueio pessimista, é necessário bloquear os registos antes de os actualizar e desbloqueá-los após a actualização. Enquanto um registo estiver bloqueado, guardar / deixar cair / bloquear o registo noutros processos falhará até que seja desbloqueado pelo processo que o bloqueou.
Para bloquear uma entidade, utilizar o método lock() e o método unlock() para o desbloquear.
O 4D “clássico” utiliza o bloqueio pessimista.
EXEMPLO
C_OBJECT
($employee;$statusLock;$statusSave;$statusUnLock)
// Get the first employee whose last name is "Wates" $employee :=ds.Employee.query("lastName=:1"; "Wates").first()
If ($employee#Null)
$statusLock :=$employee.lock() // Lock the entity
// The entity has been successfully locked
If ($statusLock.success)
$employee .lastName:="Mac Arthur" // Set name to "Mac Arthur"
// Save employee-No need to check the status because the entity is locked
$statusSave :=$employee.save()
// Unlock entity, so other processes will be able to save/drop/lock it
$statusUnLock :=$employee.unlock()
End if
End if
// The record in the database has been updated
Não tenha medo de esquecer de desbloquear um registo, a ORDA desbloqueia-o automaticamente se não houver mais referências sobre a entidade que o bloqueou.