Funcionamento de Transação

Encontrei na documentação o seguinte texto na macro sc_begin_trans:

Nas aplicações de fomulário, os eventos (onAfterInsert, onAfterUpdate, onAfterDelete, onBeforeInsert, onBeforeUpdate or onBeforeDelete) são automaticamente protegidos por um controle de transação, desde que a conexão seja a mesma da aplicação.

Como estou usando o evento onBeforeInsert e de acordo com o texto acima, não coloquei o sc_begin_trans.

Coloque nesse evento um update e tudo certo.
Após o insert, forcei um erro no sql seguinte.
Checo o erro e se existir, dou um rollback e a mensagem de erro.

O problema ven aí, erro rollback não funciona, o update anterior não é desfeito.

Existe um bug aí?
Existe mesmo uma transação iniciada antes do evento?
É preciso então iniciar uma transação no evento?

Porque daria erro em um insert?

Deixe a aplicação de formulário cuidar disso.

Oi Haroldo
Deixa eu explicar melhor
No evento onBeforeInsert preciso fazer atualizações de outras tabelas ( não iniciei uma transação
pois o manual disse que não precisa ).

  • Um update
  • Um insert
  • Outro update
  • Outro insert

Para efeito de testar a transação, coloquei um erro nesse primeiro insert para testar o comportamento
da transação.
Toda a duvida é essa.
a aplicação me avisou que o insert estava errado, mas a instrução sc_rollback_trans que eu mandei executar não funcionou. Ele não desfez o update anterior.

Vou ter que iniciar uma transação? Vai ficar com duas ?

Não aconselho fazer outras atualizações dentro da beforeinsert.
Pois pode dar erro e você executou atualizações de m outras tabelas.

Agora fiquei mais confuso.

Se não fizer na boforeinsert onde é que farei essas atualizações, pois tem dados que serão passados para o insert principal?