Velocità delle transazioni notificando all'oggetto radice

Per usare le transazioni automatiche in modo efficace, ogni componente transazionale deve indicare che ha completato il proprio lavoro. Quando un'istanza dell'oggetto completa correttamente l'attività, deve impostare i flag coerenti ed eseguiti su True chiamando il metodo IObjectContext::SetComplete. Quando tutti gli oggetti interni della transazione hanno chiamato SetComplete, la transazione può essere terminata disattivando in modo esplicito l'oggetto radice chiamando il relativo metodo SetComplete. Indicando in modo esplicito che un oggetto radice ha completato il lavoro, è possibile ridurre la lunghezza della transazione.

Quando un metodo di oggetto transazionale ha esito negativo, l'oggetto deve impostare il flag coerente su False e il flag completato su True chiamando il metodo IObjectContext::SetAbort. Chiamando il metodo SetAbort , un oggetto restituisce il controllo al chiamante e garantisce che la transazione venga interrotta.

Tuttavia, a meno che l'oggetto che chiama SetAbort sia la radice della transazione, la transazione continua a essere eseguita anche se non è possibile salvarlo dall'interruzione finale. Per velocizzare la chiusura di una transazione non riuscita, è possibile generare un errore per avvisare l'oggetto radice di chiamare anche SetAbort. Per il completamento, l'oggetto radice deve quindi inviare un messaggio di errore al client.

Anche se esistono molti approcci diversi che è possibile adottare per gestire gli errori, l'approccio deve coordinare chiaramente le comunicazioni tra gli oggetti interni e l'oggetto radice.

I frammenti di codice visual Basic seguenti mostrano un approccio alla gestione degli errori. Nel primo frammento, un oggetto interno chiama SetAbort, genera un errore e genera un messaggio di errore, come indicato di seguito:

Dim ObjCtx As ObjectContext
Dim ErrorCode As Long, Description As String

Set ObjCtx = GetObjectContext()
ObjCtx.SetAbort
ErrorCode = vbObjectError + 5
Description = "Some meaningful message"
Err.Raise ErrorCode, , Description

Nel secondo frammento, l'oggetto radice gestisce l'errore e passa il messaggio al client, come indicato di seguito:

Sub MyObjMethod1()
  On Error GoTo MyObjMethod1_err
  Dim ObjCtx As ObjectContext
  Dim InteriorObj1 As Cinterior  ' Cinterior is a user-defined object.

  Set ObjCtx = GetObjectContext()
  Set InteriorObj1 = CreateObject ("MyDll.Cinterior")
  InteriorObj1.Method1
  ' If the call completed successfully, then...
  ObjCtx.SetComplete
Exit Sub
  MyObjMethod1_err:
  ' Doom the transaction and exit.
  ObjCtx.SetAbort
  ' Pass the message back to client.
  Err.Raise Err.Number, , Err.Description
End Sub

Gestione delle transazioni automatiche in COM+