Transações

Uma transação é uma coleção de operações que desempenha uma função lógica única. Ela tem que ter as seguintes propriedades:

  • atomicidade: todas as operações contidas na transação são tratadas como uma única unidade. Todas as operações são feitas ou nada é feito.
  • consistência: uma transação concluída deixa o sistema em um estado interno consistente.
  • isolamento: em um ambiente de múltiplas transações, uma não interfere na outra.
  • durabilidade: os resultados das transações são armazenadas permanentemente no sistema.

Níveis de isolamento suportados

Na atual versão do Calypte, somente o nível de isolamento READ COMMITTED é suportado. Ele permite que uma transação leia e manipule os dados já confirmados por outras transações. As alterações dentro de uma transação somente ficarão visíveis para as demais após a sua confirmação. Esse nível de isolamento evita a leitura suja, porém, permite a leitura fantasma e a leitura não repetitiva.

Iniciando uma transação

Uma transação é iniciada com o uso do comando begin e finalizada com o comando commit ou rollback.

Comando begin

O comando begin marca o início de uma transação. Será retornado ok se o comando for executado com sucesso ou uma mensagem de erro. Após executado o comando, as operações serão agrupadas em uma transação que deve ser confirmada com o comando commit ou descartadas com o comando rollback.

//inicia a transação.
begin
ok

Comando commit

O comando commit confirma todas as operações da transação atual e libera todos os bloqueios detidos pela atual sessão.

Será retornado ok se o comando for executado com sucesso ou uma mensagem de erro.

//inicia a transação.
begin
ok
...
//confirma todas as operações
commit
ok

Comando rollback

O comando rollback desfaz todas as operações da transação atual e libera todos os bloqueios detidos pela atual sessão.

Será retornado ok se o comando for executado com sucesso ou uma mensagem de erro.

//inicia a transação.
begin
ok
...
//cancela todas as operações.
rollback
ok

Modo de confirmação automática

Uma outra forma de iniciar e finalizar transações é usando o modo de confirmação automática. Ele é ligado e desligado com o comando set_var auto_commit valor. Para iniciar o modo de confirmação automática o valor tem que ser true e para desligá-lo false. Ao religá-lo, todas as operações executadas após seu desligamento serão confirmadas. Isto equivale ao comando commit. Se o modo de confirmação automática estiver ligado, todas as operações serão tratadas como transações individuais. Caso contrário, as operações serão agrupadas em uma transação que pode ser confirmada com o comando commit ou descartadas com o comando rollback.

Por padrão, cada nova conexão inicia com o modo de confirmação automática ligada.

//inicia a transação.
set_var auto_commit false
ok
...
//confirma todas as operações.
set_var auto_commit true
ok

Evitando a leitura fantasma e leitura não repetitiva

Para resolver o problema de leitura fantasma e leitura não repetitiva, é oferecido a opção de bloquear um determinado item no momento de sua seleção. A opção é o parâmetro forUpdate do comando get que tem que ser 1.

Depois que o comando get é executado, o item fica bloqueado até que o comando commit ou rollback seja executado.

//inicia a transação
begin
ok

//obtém o valor e o bloqueia
get key 1
value key 5 0
12345
end

//atualiza o valor
set key 0 0 5
00000
end
replaced

//confirma a alteração
commit
ok