Bloqueio de entidades com ORDA

Tradução automática de Deepl

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.

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.